繁体   English   中英

在PostgreSQL和Oracle中,何时将NULL和空字符串视为相同?

[英]In PostgreSQL and Oracle, when are NULL and empty string treated the same?

我创建了以下dbfiddle,您可以在其中看到<<>字段排除了字段为null的情况。

https://www.db-fiddle.com/f/xdfayYMvdRZDRRASvGFdpT/0

CREATE TABLE test (
  prd_typ_cd bpchar,
  prd_prnt_typ_cd bpchar,
  prd_chld_typ_cd bpchar
);
INSERT INTO test VALUES ('SHC', null, 'DIV');

INSERT INTO test VALUES ('DIV', 'SHC', 'DEP');

INSERT INTO test VALUES ('DEP', 'DIV', null);

SELECT * FROM test WHERE prd_chld_typ_cd <> '';

我很惊讶地看到这一点,因为在大多数语言中,NULL和''(空字符串)被区别对待。

上面的示例来自PostgreSQL数据库。 在Oracle数据库上是否也是如此? 在什么情况下PostgreSQL和Oracle将NULL和''(空字符串)视为同一事物?

NULL '' 的Postgres被区别对待。

 prd_chld_typ_cd <> ''

返回NULLprd_chld_typ_cdNULL 这是大多数涉及NULL操作的典型行为。 您会发现:

 prd_chld_typ_cd = ''

当该列为NULL时,其行为完全相同。

对于任何其他值,表达式返回true或false。 如果返回值,您将很容易看到这一点:

SELECT t.*, prd_chld_typ_cd <> ''
FROM test t;

发生的是,在WHERE过滤器中以相同的方式处理NULL和false -都过滤出该行。

相反, NULL''是Oracle中的同义词。 但是事实证明

 prd_chld_typ_cd <> ''
 prd_chld_typ_cd = ''

prd_chld_typ_cdNULL时,两者的行为相同。 但是,可惜的是,在Oracle中,两者总是返回NULL ,因为''等效于NULL

我不了解postgres,但是oracle对于空字符串有一些怪癖,如果您打算在应用程序中支持它,则需要注意以下几点:1.在Oracle中,空字符串总是被认为是NULL:如果您插入一个空字符串字符串,您将读回NULL。 在oracle中,空字符串根本不存在:在处理varchar值时,如果可以写''而不是NULL,则它只是一个“语言语法糖”。 2.在Oracle中,此''为null将求值为TRUE。 空字符串为DE FACTO null3。在oracle中,任何涉及NULL值的比较都将始终评估为FALSE。 这意味着您可以应用于NULL值并且可以返回TRUE的唯一运算符是“ is null”和“ is not null”

上面的结果是,在oracle中,无论myvar的实际值如何,以下所有表达式将求值为FALSE:

 myvar = '' 
 myvar <> '' 
 myvar = null
 myvar <>null

即使这些评估总是错误的

 null = null
 null<>null
 null = '' 
 null <> '' 

因此以下更新不会更新任何内容:

更新mytab设置myfield ='X'其中myfield =''

如我所说,您只能使用'is null'和'is not null'运算符。 所以你必须写成

更新mytab设置myfield ='X',其中myfield为null。

PS唯一将null作为不同的可比较值处理的oracle函数是Decode()。 可能这是一个错误,但今天有太多的软件依靠此行为来修复它。

  decode( <expression>,
          <caseval 1>,  < exitval 1>,
          <caseval 2>,  < exitval 2>,
          .... 
           <elseval>) 

是sql构造案例的旧实现。在此函数中,oracle将NULL(因此也包括空字符串)视为可比较值。 因此您可以将NULL用于,它将匹配空值(和空字符串)。 这是唯一发生这种情况的情况。

如果您尝试使用标准的SQL Case构造执行此操作,则它将无法正常工作:oracle没有在此处复制错误。

PS:很抱歉,如果回复的格式看起来很奇怪。 我正在用手机写...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM