我正在尝试进行查询并在下面的源代码中停止:
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)
什么?
答案 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