本文于 3 天前发布,最后更新于 3 天前
很多客户在执行CASE WHEN语句时报错,总怀疑是DM数据库的BUG,但其实不然。本文就来讲解一下。
执行如下SQL
SELECT
CASE WHEN INSTR('1100', ',') > 0 THEN LEFT('1100', INSTR('1100', ',')-1) ELSE '1100' END AS STR
FROM
DUAL;
报错:[-6803]:非法的参数数据。原因是LEFT(‘1100’, INSTR(‘1100’, ‘,’)-1)这部分计算完是LEFT(‘1100’, -1),-1是不符合参数规则的,所以导致整个SQL报错。
可以通过添加HINT来解决
SELECT /*+CASE_WHEN_CVT_IFUN(8)*/
CASE WHEN INSTR('1100', ',') > 0 THEN LEFT('1100', INSTR('1100', ',')-1) ELSE '1100' END AS STR
FROM
DUAL;
另外,提到这个参数。也可以将CASE WHEN查询表达式转换为IFOPERATOR函数,也就是调成1。
SP_SET_PARA_VALUE(1, 'CASE_WHEN_CVT_IFUN', 1);