2013-04-26 235 views
17

我只是好奇。我知道NULL安全等运营商< =>,但有一些空安全不等于运营商,或我必须一直使用类似的东西:MySQL - NULL安全不等于运算符

(tab.id != 1 OR tab.id IS NULL) 

还是有人喜欢

!(tab.id <=> 1) 

回答

7
COALESCE(tab.id, 0) != 1 

可以在这里使用,如果你喜欢它。我浏览参数,并返回不是NULL的第一个值。在这种情况下,如果它是NULL,它会比较0 != 1。虽然它可能会使用更多的符号,但它仍然更易于管理,而不是被迫在这些情况下总是将“布尔”作为解决方案。

COALESCE()

+0

我认为这是首选的方法,因为这个查询也可以在SQL Server上运行。最好的方法是不要有空值并且有适当的默认值,但源数据不能总是由开发人员来控制。 – 2015-01-25 18:08:27

+3

不幸的是,如果你不知道这个比较的RHS的价值,你不知道什么要COALESCE()你的NULL! – Arth 2016-02-04 14:42:30

+0

如果你想比较tab.id和值,但它不起作用,如果你想比较tab.id和tab_childs.tab_id这两个字段。 – 2017-12-18 14:44:38

8

阅读文档我发现,NOT(NULL < => 1)的作品,我想这也是符合ISO标准,但是很麻烦。使用列名会是这样一个更好的方式来显示:NOT(tbl.col1 < => 1)

+2

'<=>'不是标准的SQL,它是MySQL的扩展。对于SQL来说,标准等效的无效安全比较是非常冗长的:'IS [NOT] DISTINCT FROM'。 – 2013-11-04 22:27:16

0

如果您知道比较IS NOT NULL的RHS:

COALESCE(tab.id != 1, 1) 

或者

COALESCE(tab.id != 1, TRUE) 

会给你正确的结果。

这是否是更好更具可读性比:

(tab.id != 1 OR tab.id IS NULL) 

是值得商榷..

我也被引诱与比较第一滤除NULL逻辑,所以我不必想想他们!我可能会写你的第一个等式为:

(tab.id IS NULL OR tab.id != 1) 

性能将取决于NULL小号患病但是。

1

现在MySQL没有NULL-safe不等于运算符。

使用的MySQL最普遍的解决方案是:

!(tab.id <=> 1) 

NOT tab.id <=> 1 

,因为它会正常工作,如果连到位1您将使用NULL