为什么这个CASE表达式会出现“不一致的数据类型”错误?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么这个CASE表达式会出现“不一致的数据类型”错误?相关的知识,希望对你有一定的参考价值。
我试图在条件为假时返回整数量,在条件为真时返回字符串。
SELECT
ENAME,
CASE WHEN COMM IS NULL THEN 'no commission'
ELSE COMM
END AS COMMISSION
FROM EMP
我收到此错误:
ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
答案
你需要使用CAST
:
SELECT ENAME, CASE WHEN COMM IS NULL THEN 'no commission'
ELSE CAST(COMM AS VARCHAR2(20)) END AS COMMISSION
FROM EMP;
或者使用COALESCE
:
SELECT ENAME, COALESCE(CAST(COMM AS VARCHAR2(20)), 'no commision')
FROM EMP;
另一答案
来自Oracle SQL Language Reference 18c:
对于简单和搜索的CASE表达式,所有return_exprs必须具有相同的数据类型(CHAR,VARCHAR2,NCHAR或NVARCHAR2,NUMBER,BINARY_FLOAT或BINARY_DOUBLE),或者必须都具有数字数据类型。如果所有返回表达式都具有数字数据类型,则Oracle确定具有最高数字优先级的参数,将其余参数隐式转换为该数据类型,并返回该数据类型。
字符串文字'无佣金'的数据类型是VARCHAR2,列COMM似乎是数字数据类型,因此抛出错误。
您可以将else子句中的返回值COMM转换为VARCHAR2,以避免此错误。我认为最好的方法是使用TO_CHAR function,因为这可以让你控制显示数字的格式。
另一答案
所有案例的所有数据类型必须匹配您使用的任何比较结构,如case..when
,decode
,nvl
或nvl2
。我建议你使用nvl
或nvl2
作为你的情况,因为它们对于空值案例更直接:
SELECT ENAME,
nvl(to_char(COMM),'no commission') AS COMMISSION,
nvl2(COMM,to_char(COMM),'no commission') AS COMMISSION2
FROM EMP;
以上是关于为什么这个CASE表达式会出现“不一致的数据类型”错误?的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 ref 游标提取到嵌套表中时出现不一致的数据类型错误