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

Posted

技术标签:

【中文标题】Oracle 在 case 语句和插入中使用引号的区别【英文标题】:Oracle differences using Quotes in case statement and insert 【发布时间】:2020-02-14 04:27:49 【问题描述】:

我遇到了这种情况,在数字列上基于 '' 的插入工作正常,而 case 语句给出了不同的错误。 “不一致的数据类型:预期的 %s 得到了 %s”

我已经阅读了这里 (ORA-00932 inconsistent datatypes expected char got number) 和 Oracle SQL CASE WHEN ORA-00932: inconsistent datatypes: expected CHAR got NUMBER 00932. 00000 - "inconsistent datatypes: expected %s got %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 语句更新列时,出现此错误。我可以使用 to_number 或删除引号来避免此错误,但想了解当 else 语句中给出的列是数字本身时,为什么会出现引号。 Oracle中不存在隐式转换吗?

update testtbl 
set id = case when name = 'abc' then '5000' else id end;

【问题讨论】:

Oracle 中可能存在某种隐式转换(在 mysql 和其他一些数据库中肯定存在),但即便如此,您也不应该依赖它。相反,始终确保CASE 表达式的所有分支都具有相同的类型。 您的代码应该可以工作,除非'5000' 不能转换为数字。 @TimBiegeleisen 是的,我会确保在使用此语句时不要依赖隐式转换 @Gordon ..是的,相同的语句在 MS SQL 中适用于 int 数据类型,而对于 Oracle,我必须删除引号,因为它可能会根据 oracle 隐式转换文档转换为 char .. 没有引号它按预期工作正常 【参考方案1】:

Oracle中不存在隐式转换吗?

确实如此。请参阅文档,例如 here。

这是 oracle 默认行为与 case 语句。

是的。来自documentation:

对于简单和搜索的 CASE 表达式,所有 return_exprs 必须具有相同的数据类型(CHAR、VARCHAR2、NCHAR 或 NVARCHAR2、NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE),或者都必须具有数字数据类型。

【讨论】:

谢谢@Stefan,这很有帮助。我看到了有关使用隐式转换将数字可能转换为不同数据类型的表格,所以我想在 Oracle 中使用更新时避免使用引号总是好的。 不客气!首选显式转换(Oracle 建议这样做 - 请参阅答案中的文档链接。)

以上是关于Oracle 在 case 语句和插入中使用引号的区别的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中插入带有带引号的字段数据(解决办法)

Oracle的sql语句中case关键字的用法

如何在oracle中插入含有半角单引号'的字符串

Oracle触发器使用case语句创建

数据库插入语句单引号和双引号区别

oracle插入字符串数据时,字符串中有'单引号