【问题标题】:Problem with Big Query filters when your data has a null in a column当您的数据在列中为空时,Big Query 过滤器出现问题
【发布时间】:2020-05-18 22:22:27
【问题描述】:

从今天开始,我在 Google Big Query 中遇到了一个奇怪的问题。以下查询不返回任何记录。昨天没看到这个问题

WITH Q1 AS (SELECT 'XC1' AS XC , NULL AS NU 
UNION ALL
SELECT 'XC2' AS XC , 'TAB' AS NU )

SELECT * FROM Q1
WHERE NU != 'TAB'

理想情况下,它应该显示 XC = XC1 的记录,但它不返回任何记录。

你们都面临同样的问题吗?当我们在其他领域面临更大的问题时,请尽快通知我们。

你能建议这里发生了什么吗?

【问题讨论】:

  • 您能否澄清一下-您的问题是为什么今天发生这种情况而昨天还在工作?或者您问如何解决您的查询?
  • 我的问题是为什么昨天有效,但今天无效。
  • 这是我的猜测。希望 BigQuery 团队的人能抓住这个问题并提供答案

标签: sql google-bigquery where-clause sql-null


【解决方案1】:

解决 BigQuery 标准 SQL 的这种情况的另一个选项是

WHERE IFNULL(NU != 'TAB', TRUE)    

【讨论】:

    【解决方案2】:

    您正在寻找一个空安全比较。在标准 SQL 中,您通常会使用运算符 IS [NOT] DISTINCT FROM:

    SELECT * FROM Q1 WHERE NU IS DISTINCT FROM 'TAB'
    

    不幸的是,很少有数据库支持这种语法,而 BQ 不是其中之一。所以我们需要使用一个条件表达式:

    SELECT * FROM Q1 WHERE NU IS NULL OR NU != 'TAB'
    

    【讨论】:

    • OP 声明 - 我昨天没有看到这个问题
    • @MikhailBerlyant:对我来说,我看不到 OP 的查询将如何工作。但是……你比我更了解 BQ!
    • 是的。我只是想弄清楚OP问题的重点是什么。是行为改变(假设它真的改变了)还是如何修复
    【解决方案3】:

    BigQuery 没有 NULL-safe 运算符。不过,它确实有类似的方法:

    where not ((nu = 'TAB') is false)
    

    我承认or 解决方案可能更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2015-10-19
      • 2014-04-06
      相关资源
      最近更新 更多