即使在过滤掉NULL safe_cast之后,Google BigQuery也会出现“糟糕的双重价值”

时间:2017-11-09 18:46:49

标签: sql google-bigquery

当我运行以下查询时(请注意,它包含safe_cast检查):

    SELECT
    someField
    FROM some_table
    WHERE someField IS NOT NULL 
    AND safe_cast(someField AS FLOAT64) IS NOT NULL 
    AND CAST(someField AS FLOAT64) > 200.0
    LIMIT 10

我得到以下结果:

400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "location" : "query",
    "locationType" : "other",
    "message" : "Bad double value: ; while executing the filter on column 'someField'; File: ':mdb=cloud-dataengine'",
    "reason" : "invalidQuery"
  } ],
  "message" : "Bad double value: ; while executing the filter on column 'someField'; File: ':mdb=cloud-dataengine'"
}

safe_cast(someField AS FLOAT64) IS NOT NULL不应该滤除无法转换为FLOAT64的值吗?如果没有safe_cast,我怎么能避免“坏的双重值”?

如果我从查询中删除AND CAST(someField AS FLOAT64) > 200.0,我就不会抱怨,因此必须进行此比较导致错误...但我不明白为什么safe_cast不会将其过滤掉。< / p>

1 个答案:

答案 0 :(得分:3)

SQL查询通常不保证表达式的评估顺序。我会说像BigQuery这样的现代数据库比其他数据库更加真实(尽管对大多数数据库来说都是如此)。

您似乎理解了解决方案。无论如何写这个更简单:

SELECT someField
FROM some_table
WHERE safe_cast(someField AS FLOAT64) > 200.0
LIMIT 10;

不需要NULL次检查。这就是说该列具有可以转换为float的值,并且该值大于200。