我试图在条件为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
答案 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..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;