Catégories :

Syntaxe de requête

VALUES

Dans l’instruction SELECT, la sous-clause VALUES de la clause FROM vous permet de spécifier un ensemble de constantes afin de former un ensemble fini de lignes.

Pour plus d’informations sur la clause VALUES dans l’instruction INSERT, voir la documentation de l’instruction INSERT.

Syntaxe

SELECT ...
FROM ( VALUES ( <expr> [ , <expr> [ , ... ] ] ) [ , ( ... ) ] )
  [ [ AS ] <table_alias> [ ( <column_alias> [ , ... ] ) ] ]
[ ... ]

Paramètres

expr

Chaque expression doit être une constante ou une expression pouvant être évaluée comme une constante lors de la compilation de l’instruction SQL.

La plupart des expressions arithmétiques simples et des fonctions de chaîne peuvent être évaluées au moment de la compilation, mais la plupart des autres expressions ne le peuvent pas.

table_alias

Alias facultatif pour donner un nom à l’ensemble de lignes, comme si l’ensemble de lignes était une table.

column_alias

Des alias de colonnes facultatifs peuvent spécifier les noms des colonnes.

Notes sur l’utilisation

  • Dans une clause FROM, une clause VALUES ne peut pas contenir le mot clé DEFAULT. Cette limite est en contraste avec la clause VALUES d’une instruction INSERT, qui prend en charge l’utilisation de DEFAULT; par exemple, INSERT INTO table VALUES (10, DEFAULT, 'Name') ....

  • Lorsqu’une clause VALUES inclut plusieurs valeurs de types de données différents pour la même colonne, Snowflake détermine un type de données commun qui peut englober toutes les valeurs et convertit implicitement chaque valeur en ce type commun. Cette conversion peut produire des résultats inattendus ou des erreurs si vous n’en êtes pas conscient.

    Pour éviter une conversion forcée inattendue, CAST explicitement chaque valeur vers le type souhaité, séparez les valeurs en plusieurs instructions SQL, ou assurez-vous que toutes les valeurs d’une colonne partagent le même type.

    Exemple numérique

    Lorsque les valeurs numériques de la même colonne diffèrent considérablement en termes d’échelle ou de précision, Snowflake peut renvoyer une erreur out of range car une valeur ne correspond pas au type numérique commun déterminé.

    SELECT column1 FROM VALUES
      (3.469446951953614e-18),
      (115898.73);
    
    100039 (22003): Numeric value '115898.73' is out of range
    

    Pour les valeurs numériques en particulier, vous pouvez également spécifier des valeurs sous forme de chaînes de texte entre guillemets, puis les convertir en valeurs numériques, si nécessaire.

    Exemples d’horodatage

    Lorsque des valeurs d’horodatage de types différents apparaissent dans la même colonne, Snowflake convertit toutes les valeurs en un type d’horodatage commun. Dans l’exemple suivant, une valeur TIMESTAMP_NTZ est contrainte à se transformer en TIMESTAMP_LTZ :

    SELECT $1 AS a, SYSTEM$TYPEOF(a) FROM VALUES
      (TO_TIMESTAMP_LTZ('2025-03-24 01:37:00 -0700')),
      (TO_TIMESTAMP_NTZ('2025-03-24 08:37:00'));
    
    +-------------------------------+------------------+
    | A                             | SYSTEM$TYPEOF(A) |
    |-------------------------------+------------------|
    | 2025-03-24 01:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    | 2025-03-24 08:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    +-------------------------------+------------------+
    
  • La clause VALUES est limitée à 200 000 lignes.

Exemples

Les exemples suivants utilisent la clause VALUES pour générer un ensemble fixe connu de lignes :

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+---------+
| COLUMN1 | COLUMN2 |
|---------+---------|
|       1 | one     |
|       2 | two     |
|       3 | three   |
+---------+---------+

Vous pouvez faire référence à des valeurs soit par nom de colonne (implicite), soit par position de colonne. L’exemple suivant fait référence à la deuxième colonne par sa position :

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+-------+
| COLUMN1 | $2    |
|---------+-------|
|       1 | one   |
|       2 | two   |
|       3 | three |
+---------+-------+

L’exemple suivant distingue plusieurs clauses VALUES en utilisant des alias :

SELECT v1.$2, v2.$2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1
        INNER JOIN (VALUES (1, 'One'), (3, 'three')) AS v2
  WHERE v2.$1 = v1.$1;

Vous pouvez également spécifier des alias pour les noms de colonnes, comme indiqué dans l’exemple suivant :

SELECT c1, c2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1 (c1, c2);