Sous-requêtes d'expression

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 de sous-requêtes d'expression suivants, 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