coulmn 中的 NULL 值无法通过 POSTGRES SQL 中的相等运算符进行比较 [duplicate]

NULL values in coulmn are not comparable via equality operator in POSTGRES SQL [duplicate]

提问人:Abdul Basit 提问时间:5/11/2023 更新时间:5/11/2023 访问量:31

问:

我想从单个表中获取记录,其中列值与特定值和状态值相同。因此,我从表本身自行加入end_dateso_line_id

编号 so_line_id 价值 end_date create_date
1 4040 产品 提交 2022-02-07 02:03:40 2022-02-07 02:03:30
2 4040 产品 pending_fulfillment 2022-02-07 03:03:10 2022-02-07 02:03:40
3 4040 产品 积极 2022-02-07 03:03:10
4 4040 产品 积极 2022-02-15 06:20:10

我试图通过下面的查询提及来获得结果select * from product_history h1 join product_history h2 on h1.so_line_id = h2.so_line_id and h2.id != h1.id and h1.end_date = h2.end_date where h1.so_line_id = 4040;

当我们有 datetime 值而不是 NULL 时,上面完全可以正常工作。

sql postgresql null

评论

0赞 jarlh 5/11/2023
如果要包含“NULL 等于 NULL”,可以执行 .col1 is not distinct from col2
0赞 Abdul Basit 5/11/2023
@nbk 是的,但没有找到。我从博客 percona.com/blog/handling-null-values-in-postgresql 了解这个问题
0赞 nbk 5/11/2023
Null 处理在每个数据库中都是平等的,因为它被定义为标准,并且每个数据库系统都有自己的 NULL 安全平等处理,因此您会发现实际上有很多线程。
0赞 nbk 5/11/2023
在 Posthgres stackoverflow.com/questions/33828329/ 上进行 nukll 安全比较......

答:

0赞 Abdul Basit 5/11/2023 #1

我们需要了解 NULL 在 PostgreSQL 中没有价值。它不等于 0、空字符串或空格。因此,没有相等运算符适用于 NULL 值。

select null = null;

是的,但我们没有得到任何结果。

而不是 or 我们应该使用 or 语句。=!=isis not

select null is null;

?列?

现在,我通过语句将查询更改为测试的 null 值,如果有,还使用相等运算符来测试 datetime 对象is

select * from product_history h1
join product_history h2 on h1.so_line_id = h2.so_line_id and h2.id != h1.id
and
(
(h1.end_date = h2.end_date)
OR
(h1.end_date is null and h2.end_date is null)
)
where h1.so_line_id = 4040;

评论

0赞 jarlh 5/11/2023
IS 是 <null 谓词>的一部分,它不是一个语句。