我只是好奇。我知道NULL安全等运营商< =>,但有一些空安全不等于运营商,或我必须一直使用类似的东西:MySQL - NULL安全不等于运算符
(tab.id != 1 OR tab.id IS NULL)
还是有人喜欢
!(tab.id <=> 1)
我只是好奇。我知道NULL安全等运营商< =>,但有一些空安全不等于运营商,或我必须一直使用类似的东西:MySQL - NULL安全不等于运算符
(tab.id != 1 OR tab.id IS NULL)
还是有人喜欢
!(tab.id <=> 1)
COALESCE(tab.id, 0) != 1
可以在这里使用,如果你喜欢它。我浏览参数,并返回不是NULL
的第一个值。在这种情况下,如果它是NULL
,它会比较0 != 1
。虽然它可能会使用更多的符号,但它仍然更易于管理,而不是被迫在这些情况下总是将“布尔”作为解决方案。
阅读文档我发现,NOT(NULL < => 1)的作品,我想这也是符合ISO标准,但是很麻烦。使用列名会是这样一个更好的方式来显示:NOT(tbl.col1 < => 1)
'<=>'不是标准的SQL,它是MySQL的扩展。对于SQL来说,标准等效的无效安全比较是非常冗长的:'IS [NOT] DISTINCT FROM'。 – 2013-11-04 22:27:16
如果您知道比较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
小号患病但是。
现在MySQL没有NULL-safe不等于运算符。
使用的MySQL最普遍的解决方案是:
!(tab.id <=> 1)
或
NOT tab.id <=> 1
,因为它会正常工作,如果连到位1
您将使用NULL
。
我认为这是首选的方法,因为这个查询也可以在SQL Server上运行。最好的方法是不要有空值并且有适当的默认值,但源数据不能总是由开发人员来控制。 – 2015-01-25 18:08:27
不幸的是,如果你不知道这个比较的RHS的价值,你不知道什么要COALESCE()你的NULL! – Arth 2016-02-04 14:42:30
如果你想比较tab.id和值,但它不起作用,如果你想比较tab.id和tab_childs.tab_id这两个字段。 – 2017-12-18 14:44:38