我正在尝试进行查询,并在以下源中停止:
btrim =干净的空间
上限= a-> A
pcc.mac返回“”(空)
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时,可以使用合并函数返回另一个值。对您合并到查询中的空字符串可能很有意义:
> SELECT coalesce(NULL, '') <> 'TEST';
?column?
----------
t
(1 row)
该IS DISTINCT FROM
运营商还做了你需要的东西-它把NULL
像比较任何其他值:
> SELECT NULL IS DISTINCT FROM 'SOMETHING';
?column?
----------
t
(1 row)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句