Oracle中如何用CASE表达式将NUMBER类型列按条件转为字符串
错误原因
你遇到的ORA-00932错误由两个问题导致:
- SELECT字段列表中
address后面缺少逗号,属于基础语法错误 - CASE表达式要求所有分支的返回值类型必须统一,你的语句中THEN分支返回字符串类型的自定义文本,ELSE分支返回NUMBER类型的原生列值,Oracle无法自动兼容两种不同类型的返回值,因此抛出类型不一致错误。
可用解决方案
方案1:匹配不到指定值时返回原数值的字符串形式
用TO_CHAR()函数将ELSE分支的数值转换为字符串,保证所有分支返回类型一致,修正后的SQL如下:SELECT name, address, CASE WHEN my_num = 5 THEN 'some_string_one' WHEN my_num = 10 THEN 'some_string_two' WHEN my_num = 20 THEN 'some_string_three' ELSE TO_CHAR(my_num) END AS my_num_in_string FROM foo;方案2:匹配不到指定值时返回统一提示文本
直接将ELSE分支的返回值改为固定字符串,无需转换原数值:SELECT name, address, CASE WHEN my_num = 5 THEN 'some_string_one' WHEN my_num = 10 THEN 'some_string_two' WHEN my_num = 20 THEN 'some_string_three' ELSE '无匹配值' END AS my_num_in_string FROM foo;方案3:用DECODE函数简化等值匹配逻辑
如果你只需要做等值判断,可以用Oracle原生的DECODE函数简化写法,效果和CASE完全一致:SELECT name, address, DECODE(my_num, 5, 'some_string_one', 10, 'some_string_two', 20, 'some_string_three', TO_CHAR(my_num)) AS my_num_in_string FROM foo;
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

