Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与PostgreSQL中的NULL进行比较会产生意外结果_Sql_Postgresql - Fatal编程技术网

与PostgreSQL中的NULL进行比较会产生意外结果

与PostgreSQL中的NULL进行比较会产生意外结果,sql,postgresql,Sql,Postgresql,我正在尝试执行查询,并在下面的源代码中停止: btrim=干净空间 上限=a->a pcc.mac返回null pcc.username返回SIMONE.GISELIA btrim(upper(pcc.mac::character varying::text)) <> btrim(upper(pcc.username::text)) 如果我把代码放在上面,postgres会理解为false,但是如果我把代码放在下面,会返回true,为什么 SELECT CASE WHEN '' &

我正在尝试执行查询,并在下面的源代码中停止:

btrim=干净空间

上限=a->a

pcc.mac返回null

pcc.username返回SIMONE.GISELIA

btrim(upper(pcc.mac::character varying::text)) <> btrim(upper(pcc.username::text))
如果我把代码放在上面,postgres会理解为false,但是如果我把代码放在下面,会返回true,为什么

SELECT CASE WHEN '' <> 'SIMONE.GISELIA' THEN true ELSE false end
这两个字段返回不同的文本,结果为false,不应返回。至少我这么认为

我被这件事缠住了,不知道该怎么办

我需要比较这个选项,如果没有,源不工作

如果有人能帮助我,我会很高兴的

使用控制台源更新:

logicasistemas=# SELECT CASE WHEN '' <> 'SIMONE.GISELIA' THEN true ELSE false end;
 case 
------
 t
(1 row)

logicasistemas=# select btrim(upper(pcc.mac::character varying::text)), btrim(upper(pcc.username::text)),
case when ((btrim(upper(pcc.mac::character varying::text))::character varying)::text <> (btrim(upper(pcc.username::text))::character varying)::text) then 1 else 2 end
from provedor_configuracao_cliente pcc
where pcc.cod_servico_contrato = 31905;
 btrim |     btrim      | case 
-------+----------------+------
       | SIMONE.GISELIA |    2
(1 row)
另一更新:

logicasistemas=# SELECT CASE WHEN null <> 'SIMONE.GISELIA' THEN true ELSE false end;
 case 
------
 f
(1 row)

logicasistemas=# SELECT CASE WHEN null <> 'SIMONE.GISELIA' THEN false ELSE true end;
 case 
------
 t
(1 row)

与Oracle中的varchar不同,PostgreSQL在空字符串和NULL之间的区别是什么。将任何内容与进行比较或调用任何函数,除非函数上设置了CALL on NULL INPUT,否则NULL值将返回NULL

如果pcc.mac为NULL,则第一次比较将为NULL,但第二次查询返回true,因为空字符串不等于“SIMONE.GISELIA”

> select '' <> 'TEST';
 ?column?
----------
 t
(1 row)

> select btrim(upper(NULL)) <> 'TEST';
 ?column?
----------
 (null)
(1 row)
您可以使用IS NULL或IS NOT NULL来比较两个值,其中一个值可能为NULL

SELECT VAL1, VAL2 FROM TABLE WHERE VAL1 IS NULL;

SELECT VAL1, VAL2 FROM TABLE WHERE VAL1 IS NOT NULL;
不要写入表达式=NULL,因为NULL不等于NULL。空值表示未知值,不知道两个未知值是否相等。此行为符合SQL标准
来源:

SELECT CASE应该返回语法错误,我认为您的示例SQL可能不正确。这是因为双引号不用于文本值。哦,你在问题中提到了零。它们是不同的东西-你的意思是什么?对不起,我的错,当我在postgres上放“”时,我没有放“”,但当我只在字段中放ctrl C+ctrl V时,这就是我放在这里的原因。如果要轻松区分空字符串和null,请在psql中设置null“null”。您不需要所有这些类型转换。请阅读我答案的第二部分-NULL计算为false。请从阅读手册中的章节和开始。如果“test”不是NULL,那么为什么NULL计算为false?如果“not NULL”与NULL不同,那么应该是1。还是不?不,把任何东西和NULL比较,它就是NULL。如果要与NULL进行比较,必须使用IS NOT NULL。NULL的计算结果永远不会为false。只是评估结果不是真的。谢谢你的澄清,很抱歉,因为我是一个外行。刚刚记住的是不同于,也不是不同于,相应地更新了答案。
> SELECT coalesce(NULL, '') <> 'TEST';
 ?column?
----------
 t
(1 row)
> SELECT NULL IS DISTINCT FROM 'SOMETHING';
 ?column?
----------
 t
(1 row)
SELECT VAL1, VAL2 FROM TABLE WHERE VAL1 IS NULL;

SELECT VAL1, VAL2 FROM TABLE WHERE VAL1 IS NOT NULL;