为什么这个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..whendecodenvlnvl2。我建议你使用nvlnvl2作为你的情况,因为它们对于空值案例更直接:

SELECT ENAME, 
       nvl(to_char(COMM),'no commission') AS COMMISSION,
       nvl2(COMM,to_char(COMM),'no commission') AS COMMISSION2     
  FROM EMP;

SQL Fiddle Demo

以上是关于为什么这个CASE表达式会出现“不一致的数据类型”错误?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:不一致的数据类型问题

将数据从 ref 游标提取到嵌套表中时出现不一致的数据类型错误

查找错误 ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER

获取对象会引发不一致的数据类型:预期 - 得到 -

一些语句(switch case...)

Oracle 在 case 语句和插入中使用引号的区别