在PostgreSQL中与NULL进行比较会产生意外结果

纳坦·梅代罗斯

我正在尝试进行查询,并在以下源中停止:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么“大于”数字比较会产生意外结果

使用goroutine进行迭代会产生意外结果

在Go并行中处理数组会产生意外结果

为什么在Excel中查找会产生意外结果?

使用 "%" 操作会产生意外结果

比较两个NSDate对象的相等性会产生意外结果

Java中的XOR“ ^”产生意外结果

按日期对数组进行排序会产生意外结果

使用python进行二进制读取会产生意外结果

比较产生意外结果的字符串

在python中绘制3D零均值,单位方差高斯会产生意外结果

在类实例字典中存储对象会产生意外结果

过滤器中的Servlet转发会产生意外结果

在单击事件中更改 div 的背景颜色会产生意外(或预期?)结果

在PHP中调用(遍历)MySQL行列表会产生意外结果

在PHP中向日期时间添加月份会产生意外结果

为什么MySQL中的Modulo(带有负数)会产生意外结果?

将sympy中的值替换为列表会产生意外的结果

将元素添加到字典中的列表会产生意外的结果 c#

在我的C ++链表实现中取消引用节点指针会产生意外结果

从函数中调用malloc和realloc会产生意外结果

从迭代器中列出列表会产生意外结果

在Java中执行批处理文件会产生意外结果

为什么C中的此函数会产生意外结果?

减去numpy数组会产生意外结果

在同一模型中注释会产生意外结果

寻路代码会产生意外结果

Moment.js的简单功能会产生意外的(?)结果

写出文本框会产生意外的结果