SELECT CAST(10 AS decimal(10, 2)) 可以解析 SELECT -CAST(10 AS decimal(10, 2)) 报错:ParserException: TODO : pos 12, line 1, column 9, token CAST 版本 1.1.4
原提问者GitHub用户yozen17
CAST函数与负号一起用时有可能会解析错误。
具体而言:
CAST函数用于强制转换数据类型。
负号-用于表示负值。
通常情况下,CAST函数和负号各自有独立的语法功能。但在一起使用时,有可能会造成歧义。
例如:
sql
Copy
CAST(-100 AS DECIMAL(10,2))
这里的-100可以有两种解释:
转换-100这个值,新增一个负号。
首先转换100这个值,然后加一个负号。
很显然第二种才是想要表达的意思。
但是一些数据库(如MySQL)在解析时,忽略了本应加的负号。导致CAST后的值变成100,而不是-100。
作为一种工作方式,可以使用括号来清晰表达表达式的结构:
sql
Copy
CAST(( -100 ) AS DECIMAL(10,2))
通过在-100外面加上括号,明确表达首先应用负号,然后再做CAST转换。
所以正确的做法是:
在 CAST() 函数和负号 - 间加上括号,清晰地表达表达式的结构:
sql
Copy
CAST( (-100) AS DECIMAL(10,2))
加括号后,CAST后的值就正确变成了-100,而不再是100。
CAST函数和负号一起时要特别小心,加上括号可以有效避免因歧义而产生的解析错误。
这个问题可能是由于Druid在1.1.4版本中对负数的处理方式存在一些限制导致的。在某些旧版本的Druid中,对负数的处理可能不够完善,导致无法正确解析负数的表达式。为了解决这个问题,您可以考虑升级到Druid的更高版本,以获得更好的支持和解析能力。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。