【问题标题】:Filtering with exists in BigQueryBigQuery 中存在的过滤
【发布时间】:2025-12-19 00:35:06
【问题描述】:

我在 bigQuery 中运行以下查询,但没有得到预期的输出。不是应该只返回带Alpha的那一行吗?

SELECT * FROM UNNEST([
  STRUCT(NULL AS a, '' AS b),
  (1, 'Alpha'),
  (2, 'Bravo'),
  (3, 'Charlie'),
  (4, 'Delta')
])
WHERE EXISTS (SELECT * FROM UNNEST([
  STRUCT(NULL AS a, '' AS b),
  (1, 'Alpha')
]))

【问题讨论】:

    标签: sql google-bigquery exists


    【解决方案1】:

    您忘记了EXISTS 子查询中的WHERE 子句,这就是为什么它总是返回行并被评估为true

    试试这个:

    SELECT * FROM UNNEST([
      STRUCT(NULL AS a, '' AS b),
      (1, 'Alpha'),
      (2, 'Bravo'),
      (3, 'Charlie'),
      (4, 'Delta')
    ]) t1
    WHERE EXISTS (
        SELECT 1 FROM UNNEST([
            STRUCT(NULL AS a, '' AS b),
                  (1, 'Alpha')
           ]) t2
        WHERE t1.a = t2.a -- add this condition
    )
    

    【讨论】:

      【解决方案2】:

      改用下面

      SELECT * FROM UNNEST([
        STRUCT(NULL AS a, '' AS b),
        (1, 'Alpha'),
        (2, 'Bravo'),
        (3, 'Charlie'),
        (4, 'Delta')
      ])
      WHERE (a,b) in UNNEST([
        STRUCT(NULL AS a, '' AS b),
        (1, 'Alpha')
      ])            
      

      有输出

      【讨论】:

      • 这是我正在使用的,但我想知道为什么 EXISTS 选项不起作用
      • 因为存在下的表达式始终为真 :o) 无论评估主集中的哪一行!
      • 因此,例如当行 Bravo 与存在语句中的行 Alpha 进行比较时,它返回 true?并且不执行过滤?
      • 是的,正如我所说,无论评估哪一行 - 带有 EXISTS 的表达式总是返回两行,这意味着整个 EXISTS 最终都为真 - 总是!