为什么此CASE表达式给出“不一致的数据类型”错误?

时间:2018-09-08 09:56:35

标签: sql oracle

我试图在条件为false时返回整数,而在条件为true时返回字符串。

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

3 个答案:

答案 0 :(得分:4)

您需要使用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;

答案 1 :(得分:3)

Oracle SQL Language Reference 18c

  

对于简单的CASE表达式和搜索的CASE表达式,所有return_exprs必须具有相同的数据类型(CHAR,VARCHAR2,NCHAR或NVARCHAR2,NUMBER,BINARY_FLOAT或BINARY_DOUBLE),或者都必须具有数字数据类型。如果所有返回表达式都具有数字数据类型,则Oracle确定数字优先级最高的参数,将其余参数隐式转换为该数据类型,然后返回该数据类型。

字符串文字“ no Commission”的数据类型为VARCHAR2,而COMM列似乎是数字数据类型,因此引发错误。

您可以将else子句中的返回值COMM转换为VARCHAR2,以避免发生此错误。我认为最好的方法是使用TO_CHAR function,因为这可以让您控制所显示数字的格式。

答案 2 :(得分:2)

所有案例的所有数据类型必须匹配您使用的任何比较结构,例如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