当我运行以下查询时(请注意,它包含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>
答案 0 :(得分:3)
SQL查询通常不保证表达式的评估顺序。我会说像BigQuery这样的现代数据库比其他数据库更加真实(尽管对大多数数据库来说都是如此)。
您似乎理解了解决方案。无论如何写这个更简单:
SELECT someField
FROM some_table
WHERE safe_cast(someField AS FLOAT64) > 200.0
LIMIT 10;
不需要NULL
次检查。这就是说该列具有可以转换为float的值,并且该值大于200。