开发者社区> 问答> 正文

CAST函数与负号一起解析错误

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

展开
收起
山海行 2023-07-05 19:45:28 79 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    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函数和负号一起时要特别小心,加上括号可以有效避免因歧义而产生的解析错误。

    2023-07-30 15:37:15
    赞同 展开评论 打赏
  • 这个问题可能是由于Druid在1.1.4版本中对负数的处理方式存在一些限制导致的。在某些旧版本的Druid中,对负数的处理可能不够完善,导致无法正确解析负数的表达式。为了解决这个问题,您可以考虑升级到Druid的更高版本,以获得更好的支持和解析能力。

    2023-07-11 09:41:47
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:04:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像