当前位置:首页 > 问答 > 正文

SQL Server里空值怎么比对才靠谱,实际用的那些搜索条件到底咋写比较好

在SQL Server里处理空值(NULL)是个挺容易踩坑的事儿,尤其是对刚接触数据库不久的朋友,你可能会觉得,找NULL值嘛,直接用等号(=)不就行了?WHERE column = NULL,但实际情况是,这么写啥也查不出来,因为它从根本上就错了,这得从NULL的本质说起。

NULL的本质:未知的占位符

你得把NULL理解成“未知”或者“不适用”,而不是一个像0或者空字符串‘’那样的具体值,因为它代表“未知”,所以两个“未知”之间能画等号吗?当然不能,你不知道A,也不知道B,你怎么能断定A和B相等呢?同样,你也不能断定它们不相等,正因为这种“未知”的特性,任何与NULL进行的比较操作(=, <, >, <>)结果都不是TRUE或FALSE,而是另一个值——UNKNOWN。

在SQL的逻辑中,WHERE子句只接受结果为TRUE的条件,FALSE和UNKNOWN都会被当作不符合条件而过滤掉,当你写 WHERE column = NULL 时,对于每一行数据,这个比较的结果都是UNKNOWN,所以没有一行能满足条件,最终返回空结果集。

靠谱的比对方法:IS NULL 和 IS NOT NULL

那怎么才能正确地找到NULL值呢?SQL专门为此提供了两个操作符:IS NULLIS NOT NULL

  • 查找NULL值: WHERE column_name IS NULL 这个条件的意思是“筛选出该列的值是未知(NULL)的那些行”,只要值是NULL,这个条件就返回TRUE,行就会被选中。

  • 查找非NULL值: WHERE column_name IS NOT NULL 这个条件的意思是“筛选出该列的值是已知的(不是NULL)的那些行”,只要值不是NULL,这个条件就返回TRUE。

这是最直接、最可靠、也是唯一正确的专门用于判断NULL值的方法。

实际应用中的搜索条件怎么写

在实际的业务场景中,我们很少会只单独搜索NULL值,更多的时候,我们需要在一个条件里同时考虑已知值和未知值(NULL),这时候就需要一些技巧来让查询逻辑变得严谨。

查找所有没有电话号码的记录(假设电话号码列是NULL代表没有)

  • 错误写法: WHERE phone_number = '' OR phone_number = NULL。 这个写法有两个问题:1. 它错误地使用了 = NULL,2. 即使改成 IS NULL,如果phone_number字段里既有NULL又有空字符串‘’,这种写法是OK的,但如果数据库设计时约定只使用NULL来表示“没有”,那么检查空字符串就是多余的。
  • 靠谱写法: WHERE phone_number IS NULL。 简洁明了,直接命中目标。

查找奖金不是1000的员工(这是一个经典陷阱)

  • 有问题的写法: WHERE bonus <> 1000。 这个查询会漏掉那些奖金是NULL的员工,因为对于奖金是NULL的员工,NULL <> 1000 这个比较的结果是UNKNOWN,WHERE子句会忽略这些行,但从业务逻辑上讲,“奖金不是1000”应该包括“奖金未知”的情况吗?这要看具体需求,但很多时候是需要的。
  • 严谨的写法: WHERE bonus <> 1000 OR bonus IS NULL。 这样写,就能把奖金明确不是1000的,以及奖金未知的员工都找出来,这是处理这类“不等于”条件时非常常见的模式。

模糊查询与NULL的结合

想找名字不以“张”开头或者名字信息缺失(NULL)的员工。

  • 写法: WHERE name NOT LIKE '张%' OR name IS NULL。 原理同上,NOT LIKE 对NULL值也是无效的,会返回UNKNOWN,所以必须用OR单独把NULL的情况包含进来。

使用函数让逻辑更清晰——ISNULL函数和COALESCE函数

我们可以通过函数将NULL转换成一个特定的值,从而简化查询条件,这在拼接字符串或进行数值计算时尤其有用。

  • ISNULL函数: ISNULL(column_name, replacement_value) 如果column_name是NULL,就返回replacement_value;否则返回column_name本身。 在场景二中,我们可以换一种写法:WHERE ISNULL(bonus, -1) <> 1000。 这里我们把所有NULL的奖金都暂时看作是-1(前提是正常奖金不可能是-1),然后判断这个“转换后的值”是否不等于1000,这样也能达到目的。

  • COALESCE函数: COALESCE(value1, value2, value3, ...) 这个函数更强大,它返回参数列表中第一个非NULL的值。 一个员工可能有办公电话、手机等多个联系方式,我们想取一个有效的电话用于显示:SELECT COALESCE(office_phone, mobile_phone, '暂无联系方式') AS contact FROM employees。 它会优先返回办公电话,如果办公电话是NULL,就返回手机号,如果两者都是NULL,就返回‘暂无联系方式’。

总结一下要点:

  1. 牢记黄金法则: 永远不要用 = NULL<> NULL,必须用 IS NULLIS NOT NULL
  2. 处理“不等于”条件时要格外小心: 仔细思考业务逻辑,是否需要包含NULL值,如果需要,务必加上 OR column IS NULL
  3. 善用函数: ISNULLCOALESCE 函数是处理NULL值的利器,它们可以帮助你避免复杂的OR条件,尤其是在SELECT列表或计算字段中。
  4. 考虑数据库设计: 在设计表时,想清楚一个字段的“空”到底用NULL表示还是用一个特殊值(如0, ‘’空字符串,-1等)表示,保持一致性可以减少后续查询的复杂度。

把这些原则应用到你的SQL编写中,就能大大减少因NULL值处理不当而导致的业务逻辑错误,让你的查询结果更加准确可靠。

SQL Server里空值怎么比对才靠谱,实际用的那些搜索条件到底咋写比较好