繁体   English   中英

内连接中的null不等于输出不同的结果

[英]Not equal with null in inner join outputs different results

SELECT upper(unaccent(nome)), ouid, nome_dois, ouid_dois FROM clientes 
INNER JOIN dblink('dbname=XXXXX.org','select upper(unaccent(nome)), ouid 
FROM clientes') AS c(nome_dois varchar, ouid_dois varchar) 
ON nome = nome_dois;

 upper                           |                 ouid                 |            nome_dois            | ouid_dois 
---------------------------------+--------------------------------------+---------------------------------+-----------
 JOAO BAPTISTA                   | b9b1866a-3301-11e1-8cbb-82d9f077e206 | JOAO BAPTISTA                   | 
 OSVALDO DE ALMEIDA JOAO         | 1cd643ba-1bb5-11e2-a232-66341e648f0f | OSVALDO DE ALMEIDA JOAO         | 
 .........

SELECT upper(unaccent(nome)), ouid, nome_dois, ouid_dois FROM clientes 
INNER JOIN dblink('dbname=XXXXX.org','select upper(unaccent(nome)), ouid 
FROM clientes') AS c(nome_dois varchar, ouid_dois varchar) 
ON nome = nome_dois 
AND ouid::varchar != ouid_dois::varchar;

upper | ouid | nome_dois | ouid_dois 
-------+------+-----------+-----------
(0 rows)

我的问题是关于AND ouid::varchar != ouid_dois::varchar查询之间的唯一区别就是这个条件。 但是如果ouid_dois为null,为什么xxxxxx != null不起作用? 查询应输出相同的内容。

这些条件都是真的,对吧?

ouid      ouid_dois
xxxxxx != null

ouid      ouid_dois
xxxxxx != yyyyy

错误。 第一个条件总是错误的。 除了is NULL ,与NULL的任何比较都会产生NULL值 - SQL将其解释为FALSE。

所以,以下都是假的:

NULL = NULL
NULL <> NULL
x = NULL
x <> NULL

NULL != NULL返回false - 您需要调整WHERE子句:

SELECT upper(unaccent(nome)), ouid, nome_dois, ouid_dois FROM clientes 
INNER JOIN dblink('dbname=XXXXX.org','select upper(unaccent(nome)), ouid 
FROM clientes') AS c(nome_dois varchar, ouid_dois varchar) 
ON nome = nome_dois 
AND (ouid::varchar IS NULL
  OR ouid_dois::varchar IS NULL)
  OR ouid::varchar != ouid_dois::varchar)

暂无
暂无

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

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