F1 是字符串(MAX)列。我使用此 F1 列来存储任何数据类型,然后根据类型列的值解析该值。以下查询执行正常。
select cast(F1 as FLOAT64) from DATA where Type = 'DON' and cast(F1 as FLOAT64) > 20
但是当我强制在F1上使用索引(
select cast(F1 as FLOAT64) from DATA@{force_index = 'data_f1'} where Type = 'DON' and cast(F1 as FLOAT64) > 20
在这种情况下,它会出错:“语句失败:错误的双精度值:00e2e513-019a-44c7-88e9-8970e6c7...”
我已经验证,当 Type = 'DON' 时,F1 中的所有值始终都是存储为字符串值的浮点数。
第二个查询中的 where 条件似乎正在评估“cast(F1 as FLOAT64) > 20”,即使对于 Type != 'DON' 的行也是如此。
似乎是使用索引以及 where 条件如何执行的问题。
我试图确保当 Type = 'DON' 时 F1 的所有值都可以转换为 FLOAT64,并且我的第一个查询证明这是正确的。
我期望得到与查询 1 相同的结果,但由于索引而扫描速度更快。但查询却出错了。
不保证这些 AND 条件之间的顺序。
对于您的用例,请考虑使用
SAFE_CAST
而不是 CAST
,如果转换失败,则默认为 NULL。