如何使用DECODE函数实现小于条件判断?解决ORA-00907错误
解决DECODE函数实现小于条件判断时的ORA-00907错误
错误原因
DECODE函数仅支持等值匹配,语法格式为:DECODE(待比较表达式, 匹配值1, 返回值1, 匹配值2, 返回值2, ..., 默认返回值)
你直接在DECODE中写入salary < 6000这类比较条件,违反了函数语法规则,导致数据库解析失败,抛出ORA-00907错误。
正确的DECODE实现方式
要实现范围判断,需将比较逻辑转换为DECODE可识别的等值匹配形式,以下两种写法均可:
写法1:以TRUE作为匹配基准
将DECODE的第一个参数设为TRUE,后续每组为「比较条件+对应返回值」,利用Oracle对布尔表达式的支持实现匹配:
SELECT last_name ,salary ,DECODE(TRUE, salary < 6000, 0.36, salary < 8000, 0.38, salary < 10000, 0.4, salary < 12000, 0.42, salary < 14000, 0.44, salary < 16000, 0.45) as "TAX RATE" FROM employees;
写法2:借助SIGN函数转换差值
利用SIGN(数值)函数的特性:当数值为负时返回-1,为正时返回1,为0时返回0。通过计算薪资与阈值的差值,将范围判断转为等值匹配-1:
SELECT last_name ,salary ,DECODE(SIGN(salary - 6000), -1, 0.36, SIGN(salary - 8000), -1, 0.38, SIGN(salary - 10000), -1, 0.4, SIGN(salary - 12000), -1, 0.42, SIGN(salary - 14000), -1, 0.44, SIGN(salary - 16000), -1, 0.45) as "TAX RATE" FROM employees;
更推荐的替代方案:CASE WHEN
相比DECODE,CASE WHEN语法更直观,可读性更强,更适合范围判断场景:
SELECT last_name ,salary ,CASE WHEN salary < 6000 THEN 0.36 WHEN salary < 8000 THEN 0.38 WHEN salary < 10000 THEN 0.4 WHEN salary < 12000 THEN 0.42 WHEN salary < 14000 THEN 0.44 WHEN salary < 16000 THEN 0.45 END as "TAX RATE" FROM employees;
内容的提问来源于stack exchange,提问作者PuiPuy
相关产品推荐
相关产品推荐

