与PostgreSQL中的NULL进行比较会产生意外结果
我正在尝试执行查询,并在下面的源代码中停止: btrim=干净空间 上限=a->a pcc.mac返回null pcc.username返回SIMONE.GISELIA与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(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;