gpt4 book ai didi

sql - 与 PostgreSQL 中的 NULL 比较给出了意想不到的结果

转载 作者:行者123 更新时间:2023-11-29 12:28:56 25 4
gpt4 key购买 nike

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

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)

什么??

最佳答案

PostgreSQL 区分空字符串和 NULL(与 Oracle 中的 varchar 不同)。比较任何内容或调用任何函数(除非在函数上设置了 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)

NULL 不是真值,这就是为什么您的 CASE 表达式的计算结果为 2。

> SELECT CASE WHEN NULL <> 'test' THEN 1 ELSE 2 END;
case
------
2
(1 row)

Time: 0.285 ms
> SELECT CASE WHEN '' <> 'test' THEN 1 ELSE 2 END;
case
------
1
(1 row)

当一个值为NULL时,可以使用coalesce函数返回另一个值;合并到查询中的空字符串可能对您有意义:

> SELECT coalesce(NULL, '') <> 'TEST';
?column?
----------
t
(1 row)

IS DISTINCT FROM 运算符也可以满足您的需求——它将 NULL 视为任何其他比较值:

> SELECT NULL IS DISTINCT FROM 'SOMETHING';
?column?
----------
t
(1 row)

关于sql - 与 PostgreSQL 中的 NULL 比较给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25797121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com