Il existe quatre types de sous-requêtes d'expression (des sous-requêtes utilisées en tant qu'expressions). Les sous-requêtes d'expression renvoient NULL
ou une valeur unique, par opposition à une colonne ou une table. En outre, elles doivent être entourées de parenthèses. Pour en savoir plus sur les sous-requêtes, reportez-vous à la rubrique Sous-requêtes.
Type de sous-requête | Type de données de résultat | Description |
---|---|---|
Scalaire | Tout type T | Une sous-requête entre parenthèses à l'intérieur d'une expression (par exemple, dans la liste SELECT ou la clause WHERE ) est interprétée comme une sous-requête scalaire. La liste SELECT d'une sous-requête scalaire doit comporter exactement un champ. Si la sous-requête renvoie exactement une ligne, cette valeur unique correspond au résultat de la sous-requête scalaire. Si la sous-requête ne renvoie aucune ligne, la valeur de la sous-requête scalaire est NULL . Si la sous-requête renvoie plus d'une ligne, la requête échoue et renvoie une erreur d'exécution. Lorsque la sous-requête est écrite avec SELECT AS
STRUCT , elle peut inclure plusieurs colonnes et la valeur renvoyée est le STRUCT construit. En revanche, le fait de sélectionner plusieurs colonnes sans utiliser SELECT AS est considéré comme une erreur. |
ARRAY | ARRAY | Permet d'utiliser SELECT AS STRUCT pour construire des tableaux de structures. En revanche, le fait de sélectionner plusieurs colonnes sans utiliser SELECT AS est considéré comme une erreur. Renvoie un ARRAY vide si la sous-requête ne renvoie aucune ligne. Ne renvoie jamais un ARRAY NULL . |
IN | BOOL | Se présente dans une expression suivant l'opérateur IN. La sous-requête doit générer une seule colonne, dont le type est compatible (pour les comparaisons d'égalité) avec l'expression située à gauche de l'opérateur IN. Renvoie FALSE si la sous-requête ne renvoie aucune ligne.
x IN () équivaut à x IN (value, value, ...) . Pour obtenir une présentation complète de la sémantique utilisée, consultez la section consacrée à l'opérateur IN dans la rubrique Opérateurs de comparaison. |
EXISTS | BOOL | Renvoie TRUE si la sous-requête a généré une ou plusieurs lignes. Renvoie FALSE si la sous-requête ne génère aucune ligne. Ne renvoie jamais NULL . Contrairement à toutes les autres sous-requêtes d'expression, il n'existe ici aucune règle concernant la liste de colonnes. Il est possible de sélectionner n'importe quel nombre de colonnes sans que cela ait une incidence sur le résultat de la requête. |
Exemples
Dans les exemples suivants de sous-requêtes d'expression, nous supposons que t.int_array
est de type ARRAY<INT64>
.
Type | Sous-requête | Type de données de résultat | Notes |
---|---|---|---|
Scalaire | (SELECT COUNT(*) FROM t.int_array) |
INT64 | |
(SELECT DISTINCT i FROM t.int_array i) |
INT64, éventuellement erreur d'exécution | ||
(SELECT i FROM t.int_array i WHERE i=5) |
INT64, éventuellement erreur d'exécution | ||
(SELECT ARRAY_AGG(i) FROM t.int_array i) |
ARRAY | Utilise la fonction d'agrégation "ARRAY_AGG" pour renvoyer un tableau. | |
(SELECT 'xxx' a) |
STRING | ||
(SELECT 'xxx' a, 123 b) |
Erreur | Renvoie une erreur, car il y a plus d'une colonne. | |
(SELECT AS STRUCT 'xxx' a, 123 b) |
STRUCT | ||
(SELECT AS STRUCT 'xxx' a) |
STRUCT | ||
ARRAY | ARRAY(SELECT COUNT(*) FROM t.int_array) |
ARRAY (de taille 1) | |
ARRAY(SELECT x FROM t) |
ARRAY | ||
ARRAY(SELECT 5 a, COUNT(*) b FROM t.int_array) |
Erreur | Renvoie une erreur, car il y a plus d'une colonne. | |
ARRAY(SELECT AS STRUCT 5 a, COUNT(*) b FROM t.int_array) |
ARRAY | ||
ARRAY(SELECT AS STRUCT i FROM t.int_array i) |
ARRAY | Génère un tableau de STRUCT à un champ | |
ARRAY(SELECT AS STRUCT 1 x, 2, 3 x) |
ARRAY | Renvoie un tableau de STRUCT avec des champs anonymes ou en double. | |
ARRAY(SELECT AS TypeName SUM(x) a, SUM(y) b, SUM(z) c from t) |
array<TypeName> | Sélection dans un type nommé. Il est supposé que TypeName est un type STRUCT avec des champs a, b et c. | |
STRUCT | (SELECT AS STRUCT 1 x, 2, 3 x) |
STRUCT | Construit une STRUCT avec des champs anonymes ou en double. |
EXISTS | EXISTS(SELECT x,y,z FROM table WHERE y=z) |
BOOL | |
NOT EXISTS(SELECT x,y,z FROM table WHERE y=z) |
BOOL | ||
IN | x IN (SELECT y FROM table WHERE z) |
BOOL | |
x NOT IN (SELECT y FROM table WHERE z) |
BOOL |