表达式子查询

表达式子查询(即作为表达式使用的子查询)有四种类型。与列或表格相反,表达式子查询返回 NULL 或单个值,且必须用括号括起来。如需查看有关子查询的更完整讨论,请参阅子查询

子查询类型 结果数据类型 说明
标量 任何 T 类型 表达式中用英文括号括起的子查询(例如在 SELECT 列表或 WHERE 子句中)被解释为标量子查询。标量子查询中的 SELECT 列表只能有一个字段。如果子查询只返回一行,则该单一值就是标量子查询的结果。如果子查询未返回任何行,则标量子查询的值为 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 如果子查询生成一行或多行,则返回 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) 错误 由于存在多个列,因此返回一个错误
(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) 错误 由于存在多个列,因此返回一个错误
ARRAY(SELECT AS STRUCT 5 a, COUNT(*) b FROM t.int_array) ARRAY  
ARRAY(SELECT AS STRUCT i FROM t.int_array i) ARRAY 创建由单字段 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