判断BigQuery中的value is in an array是否使用IN UNNEST(...)的标准方法.例如:

SELECT 2 IN UNNEST([0, 1, 1, 2, 3, 5]) AS contains_value;

判断NULL值是否在数组中的建议方法是什么?有比这样做更直接的方式吗?

SELECT EXISTS(SELECT 1 FROM UNNEST([0,1,1,2,3,null,5]) v WHERE v IS NULL)

有没有更直接的方法来解决这个问题?如果BigQuery团队中的某个人或熟悉性能/优化的人:如果我在子 Select 中添加LIMIT 1有关系吗--即,exists操作符在找到结果后是否会自动短路,或者我是否必须在子查询中手动添加LIMIT 1

推荐答案

这里有一个可能的简单替代方案可供考虑:

SELECT ANY_VALUE(x IS NULL) AS contains_value
FROM UNNEST([0, 1, 1, 2, 3, NULL, 5]) AS x;

(也可以用COUNTIF(x IS NULL) > 0MAX(x IS NULL)来代替ANY_VALUE(x IS NULL),但认为后者更可取).

我不确定这在效率方面会有什么不同.与您建议的内容非常相似的内容可能也一样好(更接近文档中的内容):

SELECT EXISTS(
  SELECT * FROM UNNEST([0, 1, 1, 2, 3, null, 5]) AS x
  WHERE x IS null
  LIMIT 1)
AS contains_value;

除非你能从谷歌开发者那里得到LIMIT个问题的明确答案,否则我会把它留在这里--因为直觉上,外部 Select 只需要查看一个值.

Sql相关问答推荐

在多个柱上连接时,如何确定连接条件?

如何根据特定的内部json元素值过滤postgres查询结果?

如何根据计数和分组获取订单总数

Access中执行INSERT INTO查询时出现错误消息

按分类标准检索记录

基于多参数的SQL Server条件过滤

HAVING子句内部过滤的正确方法

我如何才能在付款人单列中拉出只有9个付款人单的人?

在SQL查询中查找客户端的最短日期比较列和多行

使用CTE在SNOWFLAKE中创建临时表

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

Postgresql 具有相似行为和模式行为的问题

SQL 中的第一个值和倒数第二个值

SQL Server中使用min()和max()从选定的特定值id表中删除不必要的时间

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

根据潜在空值的条件对记录进行计数

Snowflake 中的对象是如何比较的?

运算符不存在:integer = bigint[]

PostgresQL-根据另一列找到 3 个最低值

来自 SQL Server 的树层次 struct 图的 JSON