示例脚本:
sql1:select decode(b.ind_value,null,0.0,(t.bdhhs/t.khs) - b.ind_value) as ind_hb from test1 b, test2 t;
sql2:select cust_cls01 AS 你好-测试 from test3;
druid版本:1.2.16
操作步骤及现象:对sql1和sql2分别调用工具类:List<SQLStatement> toStatementList(String sql, DbType dbType),数据库类型是odps, 其中sql1正常解析,sql2报错:com.alibaba.druid.sql.parser.ParserException: not supported.pos 25, line 2, column 25, token -
对sql2做如下处理,用反引号转义,拆分两个:
sql3:select cust_cls01 AS `你好-测试` from test4;
sql4:select cust_cls01 AS 你好`-`测试 from test5;
操作步骤及现象:对sql3和sql4分别调用工具类:List<SQLStatement> toStatementList(String sql, DbType dbType),数据库类型是odps, 其中sql3正常解析,sql4报错:com.alibaba.druid.sql.parser.ParserException: not supported.pos 27, line 2, column 25, token IDENTIFIER `-`
总结:
(1)横线-, druid解析时需要用反引号转义,而且还要把整个token值包起来才有效, 如果只包`-`没效果(2)需要区分横线-出现的位置。如果是作为字段别名,是有影响的,需要转义。如果是在函数里面作为减号,则解析不影响。
问题:
请问一下,对于特殊符号横线,druid解析规则不统一,有的要转义,有的不要转义,在sql解析时,如何区分呢?怎么区分在函数里面,还是函数外面(sql脚本不可编辑,以上sql仅为示例)
一般对于特殊字符,要么都转义,要么都不转义