Sql 在case语句和insert中使用引号的Oracle差异

Sql 在case语句和insert中使用引号的Oracle差异,sql,oracle,Sql,Oracle,我遇到了这样一种情况,即基于数字列“”的insert工作正常,而case语句给出了不同的错误。 “不一致的数据类型:应为%s获得%s” 我已经阅读了这里给出的一些解释(),我知道我需要使用它而不加引号,但我想了解case语句的行为。SQL server不是这样的,但为什么只有oracle。这是oracle默认的case行为语句 如果我创建并插入值,我可以毫无错误地执行 create table testtbl (name varchar2(50), id number(10,2)); ins

我遇到了这样一种情况,即基于数字列“”的insert工作正常,而case语句给出了不同的错误。 “不一致的数据类型:应为%s获得%s”

我已经阅读了这里给出的一些解释(),我知道我需要使用它而不加引号,但我想了解case语句的行为。SQL server不是这样的,但为什么只有oracle。这是oracle默认的case行为语句

如果我创建并插入值,我可以毫无错误地执行

create table testtbl (name varchar2(50), id number(10,2)); 

insert into testtbl values ('abc', '123'); 
insert into testtbl values ('test', '200'); 
当我尝试使用case语句更新列时,我得到了这个错误。我可以使用_number或删除引号来避免此错误,但我想了解,当else语句中给出的列本身是number时,为什么会发生引号错误。Oracle中不存在隐式转换吗

update testtbl 
set id = case when name = 'abc' then '5000' else id end;
Oracle中不存在隐式转换吗

是的。参见文档,例如

这是oracle默认的case行为语句

对。从:


对于简单和搜索的大小写表达式,所有返回表达式都必须具有相同的数据类型(CHAR、VARCHAR2、NCHAR或NVARCHAR2、NUMBER、BINARY\u FLOAT或BINARY\u DOUBLE),或者都必须具有数字数据类型。

Oracle中可能存在某种隐式转换(MySQL和其他一些数据库上肯定存在这种转换),但即便如此,你也不应该依赖它。相反,请始终确保
CASE
表达式的所有分支具有相同的类型。除非
'5000'
无法转换为数字,否则您的代码应该可以工作。@TimBiegeleisen是的,在使用此表达式时,我将确保不依赖隐式转换statement@Gordon..Yeah对于int数据类型,同样的语句也适用于MS SQL,而对于Oracle,我必须删除引号,因为它可能会根据Oracle隐式转换文档转换为字符。。如果没有引号,它可以正常工作谢谢你@Stefan这很有帮助。我看到了一张表,上面列出了通过隐式转换将数字转换为不同数据类型的可能性,所以我想在Oracle中使用update时避免使用引号总是很好的。欢迎您!更喜欢显式转换(Oracle建议这样做-请参阅答案中的文档链接。)