本文于 99 天前发布,最后更新于 99 天前
很多客户在执行 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);