使用二级索引时的 CAST 问题

问题描述 投票:0回答:1

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 相同的结果,但由于索引而扫描速度更快。但查询却出错了。

google-cloud-spanner
1个回答
0
投票

不保证这些 AND 条件之间的顺序。

对于您的用例,请考虑使用

SAFE_CAST
而不是
CAST
,如果转换失败,则默认为 NULL。

© www.soinside.com 2019 - 2024. All rights reserved.