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 语句和插入中使用引号的区别的主要内容,如果未能解决你的问题,请参考以下文章