除非与IS 结合使用,否则其中包含NULL 的表达式永远不会被评估为真(但请参阅更多内容)。如MySql docs中所述:
您不能使用 =、< 或 <> 等算术比较运算符来测试 NULL。
由于与NULL 的任何算术比较结果也是NULL,因此您无法从此类比较中获得任何有意义的结果。
规则的例外情况
并非所有以NULL 作为参数的表达式都计算为NULL。除了NULL IS NULL,下面的也会产生一个真值:
NULL <=> NULL,
COALESCE(NULL, true),
IFNULL(NULL, true),
ISNULL(NULL),
1 IN (1, NULL),
INTERVAL(1, 0, 2, NULL)
CASE 1 WHEN 1 THEN TRUE WHEN NULL THEN false END
最后三个不产生NULL 的原因是这些表达式执行某种形式的short-circuit evaluation。因此,如果在从左到右的评估过程中结果是明确的,则表达式的其余部分(包括 NULL)不会被评估。
但以下所有内容都将是NULL:
NULL = NULL
CASE NULL WHEN NULL THEN TRUE END,
'test' || NULL,
GREATEST(1, NULL),
1 NOT IN (2, NULL)
请注意,在最后两个表达式中,短路是不可能的:必须评估所有参数,至少在找到 NULL 之前。
ANSI_NULLS设置
当设置为OFF 时,有一个ANSI_NULLS 设置会影响上述行为。默认为ON,实际上不应更改。如文档中所述:
重要
在 SQL Server 的未来版本中,ANSI_NULLS 将始终为 ON,任何将选项显式设置为 OFF 的应用程序都会生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
所以,我认为不值得进一步讨论这个设置:不要碰它。