標準 SQL の式サブクエリ

4 種類の式のサブクエリ、つまり、式として使用されるサブクエリがあります。式サブクエリは、列または表とは対照的に、NULL または単一の値を返します。また、式サブクエリをかっこで囲む必要があります。サブクエリの詳細については、サブクエリをご覧ください。

サブクエリの型 結果のデータ型 説明
スカラー 任意の型 T 式でかっこに囲まれているサブクエリ(SELECT リストや WHERE 句内など)は、スカラー サブクエリとして解釈されます。スカラー サブクエリ内の SELECT リストのフィールド数は、正確に 1 つである必要があります。サブクエリによって正確に 1 行が返される場合、その単一の値がスカラー サブクエリの結果になります。サブクエリがゼロ個の行を返す場合、スカラー サブクエリ値は NULL です。サブクエリが複数の行を返す場合、クエリはランタイム エラーで失敗します。サブクエリが SELECT AS STRUCT で作成される場合、複数の列を含めることができ、戻り値は構造化された STRUCT になります。SELECT AS を使用せずに複数の列を選択すると、エラーが発生します。
ARRAY ARRAY SELECT AS STRUCT を使用して STRUCT の配列を作成できます。SELECT AS を使用せずに複数の列を選択すると、エラーが発生します。サブクエリがゼロ個の行を返す場合、空の ARRAY が返されます。NULL ARRAY が返されることはありません。
IN BOOL IN 演算子に続く式で使用されます。サブクエリによって、IN 演算子の左側の式と等式互換性がある型の単一の列を生成する必要があります。サブクエリによってゼロ個の行が返される場合、FALSE が返されます。x IN ()x IN (value, value, ...) と同等です。完全なセマンティクスについては、比較演算子IN 演算子をご覧ください。
EXISTS BOOL サブクエリによって 1 つ以上の行が生成される場合、TRUE が返されます。サブクエリによってゼロ個の行が生成される場合、FALSE が返されます。NULL が返されることはありません。その他のすべての式サブクエリとは異なり、列リストに関する規則はありません。任意の数の列を選択でき、クエリの結果に影響はありません。

次の式サブクエリの例では、t.int_array の型が ARRAY<INT64> であることを前提としています。

サブクエリ 結果のデータ型 備考
スカラー (SELECT COUNT(*) FROM t.int_array) INT64  
(SELECT DISTINCT i FROM t.int_array i) INT64、場合によりランタイム エラー  
(SELECT i FROM t.int_array i WHERE i=5) INT64、場合によりランタイム エラー  
(SELECT ARRAY_AGG(i) FROM t.int_array i) ARRAY ARRAY_AGG 集計関数を使用して、ARRAY を返します。
(SELECT 'xxx' a) STRING  
(SELECT 'xxx' a, 123 b) Error 複数の列があるためエラーを返します。
(SELECT AS STRUCT 'xxx' a, 123 b) STRUCT  
(SELECT AS STRUCT 'xxx' a) STRUCT  
ARRAY ARRAY(SELECT COUNT(*) FROM t.int_array) サイズ 1 の ARRAY  
ARRAY(SELECT x FROM t) ARRAY  
ARRAY(SELECT 5 a, COUNT(*) b FROM t.int_array) Error 複数の列があるためエラーを返します。
ARRAY(SELECT AS STRUCT 5 a, COUNT(*) b FROM t.int_array) ARRAY  
ARRAY(SELECT AS STRUCT i FROM t.int_array i) ARRAY 1 フィールドの STRUCT の ARRAY を作成します
ARRAY(SELECT AS STRUCT 1 x, 2, 3 x) ARRAY 無記名または重複フィールドを持った STRUCT の ARRAY を返します。
ARRAY(SELECT AS TypeName SUM(x) a, SUM(y) b, SUM(z) c from t) array<TypeName> 名前付きの型を選択します。TypeName はフィールド a、b、c を持つ STRUCT 型であると見なします。
STRUCT (SELECT AS STRUCT 1 x, 2, 3 x) STRUCT 無記名または重複フィールドを持つ STRUCT を構築します。
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