在 PostgreSQL 和 Oracle 中,NULL 和空字符串什么时候处理相同?

ktm*_*124 1 sql oracle postgresql

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

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 <> '';
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到这一点,因为在大多数语言中 NULL 和 ''(空字符串)的处理方式不同。

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

Gor*_*off 5

NULL '' ARE Postgres里被区别对待。

 prd_chld_typ_cd <> ''
Run Code Online (Sandbox Code Playgroud)

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

 prd_chld_typ_cd = ''
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT t.*, prd_chld_typ_cd <> ''
FROM test t;
Run Code Online (Sandbox Code Playgroud)

正在发生的事情是NULLWHERE过滤器中以相同的方式处理和 false —— 都过滤掉了该行。

相比之下,NULL''在 Oracle 中是同义词。但事实证明

 prd_chld_typ_cd <> ''
 prd_chld_typ_cd = ''
Run Code Online (Sandbox Code Playgroud)

prd_chld_typ_cdis时,两者的行为方式相同NULL。唉,不过,在 Oracle 中,两者总是返回NULL——因为''等价于NULL.