Oracle SQL CASE WHEN ORA-00932: 数据类型不一致: 预期 CHAR,但得到了 NUMBER 00932. 00000 - "数据类型不一致: 预期 %s,但得到了 %s"

9

出现错误

ORA-00932: 数据类型不一致:期望 CHAR 而得到 NUMBER 00932. 00000 - "数据类型不一致:期望 %s 而得到 %s"

当我运行以下查询时

SELECT distinct 
CASE when t.cancelled = 'TRUE' then '0' 
else t.amount END AMOUNT,
FROM table t

如果我用数字或文本作为else输出来运行它,像这样,它就可以工作。

SELECT distinct 
CASE when t.cancelled = 'TRUE' then '0' 
else 'xxx' END AMOUNT,
FROM table t

1
t.amount是一个数字吗? - NullUserException
3
在这种情况下,将其转换为字符类型。(例如:SELECT ... else TO_CHAR(t_amount) ... - NullUserException
1
...或者使用 then 0 else - Joachim Isaksson
谢谢 NullUser,它起作用了 :) - Matt
对于通过 Google 带到这里的其他人:在我的情况下,这是一个绑定变量的问题。因此,也要检查一下它们。 - David Oneill
5个回答

12

使用0代替'0'。金额是一个数字,数字不需要加引号。

SELECT distinct 
CASE when t.cancelled = 'TRUE' then 0 
else t.amount END AMOUNT,
FROM table t

@Matt,你的查询中有一个'0'是varchar类型的,我将其替换为数字0。 - radar
好的解释。我已经进一步用通俗易懂的话语进行了解释,希望您不介意。我已经提到了归属 :-) - Lalit Kumar B
@LalitKumarB,我看到您在Oracle论坛上很活跃,干得好 :-) - radar

3

我从这里找到了解决这个问题的方法 ORA-00932: inconsistent datatypes: expected CHAR got NUMBER while adding 1 to a date

根据答案所述:

似乎Oracle要求CASE结构中所有THEN表达式的类型与第一个THEN之后的表达式的类型一致。 不进行任何类型转换。

这是错误的原因。基本上,你在第一个THEN部分之后提到的值的数据类型必须在同一级别的所有后续THEN中保持一致。


好的发现!因为to_char无法解决这个问题。 - manix

3
除了@RADAR的回答之外,错误的原因在于t.amount字段是一个NUMBER数据类型而不是字符串。您的CASE表达式内部试图将一个STRING安装到一个NUMBER数据类型中。正如RADAR的答案已经建议的那样,请使用零作为数字而不是字符串。

0

尝试使用to_number(t.amount)

SELECT distinct 
CASE when t.cancelled = 'TRUE' then 0 
else to_number(t.amount) END AMOUNT,
FROM table t

0

我无法将字符串值转换为数字,因此我使用TO_CHAR函数将数字转换为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接