与PostgreSQL中的NULL比较会产生意想不到的结果

时间:2014-09-11 21:19:32

标签: sql postgresql

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

btrim =干净的空间

upper = 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)

什么?

2 个答案:

答案 0 :(得分:6)

PostgreSQL区分空字符串和NULL(与Oracle中的varchar不同)。比较任何内容或调用任何函数(除非在函数上设置了CALL ON NULL INPUT),NULL值返回NULL。

如果pcc.mac为NULL,您的第一个比较将为NULL,但是第二个查询返回true,因为空字符串不等于&#39; SIMONE.GISELIA&#39;

> 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)

答案 1 :(得分:1)

您可以使用 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;

不要写expression = NULL,因为NULL不等于NULL。 (空值表示一个未知值,并且未知两个未知值是否相等。)此行为符合SQL标准
来源:PostgreSQL Comparison Operator : Documentation