当前位置: 首页 > 面试题库 >

SQL:为什么在此where子句中过滤掉NULL值?

郑西岭
2023-03-14
问题内容

在我的表中,我有一个可为空的bit列(旧系统…),另一位开发人员最近对存储过程进行了更改,以仅显示bit列不为真的值(1)。因为这是一个可为空的列,所以我们注意到,如果该列为NULL,则不会选择该记录。为什么是这样?

我和其他开发人员都同意NULL <> 1 …这是SQL中的错误还是设计这种方式?似乎是设计缺陷。

当前代码:

(VoidedIndicator <> 1)

建议的修复:

(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)

(Jon Erickson)

VoidedIndicator是一个可为空的位字段,因此它可以具有以下值:NULL,0或1

当使用诸如(VoidedIndicator <> 1)之类的where子句创建SQL语句时,我们仅返回具有VoidedIndicator == 0的记录,但是我们期望VoidedIndicator == 0和VoidedIndicator IS NULL。为什么是这样?


问题答案:

从Wikipedia条目上的NULL:

例如,WHERE子句或条件语句可能会将列的值与常量进行比较。通常错误地认为,如果该字段包含Null,则缺失值将“小于”或“不等于”常量,但实际上,此类表达式返回Unknown。下面是一个示例:

-- Rows where num is NULL will not be returned,
-- contrary to many users' expectations.
SELECT * FROM sometable WHERE num <> 1;

基本上,NULL和其他 任何 东西之间的 任何 比较(无论是=还是<>)都将是不正确的。

作为另一参考,MSDN T-SQL页面上<>指出:

比较两个表达式(比较运算符)。比较非空表达式时,如果左操作数不等于右操作数,则结果为TRUE;否则,结果为TRUE。否则,结果为FALSE。如果一个或两个操作数均为NULL,请参见SET
ANSI_NULLS(Transact-SQL)。

该SET ANSI_NULLS然后页指出:

当SET ANSI_NULLS为ON时,即使column_name中包含空值,使用WHERE column_name =
NULL的SELECT语句也将返回零行。即使column_name中包含非空值,使用WHERE column_name <>
NULL的SELECT语句也将返回零行。

当SET ANSI_NULLS设置为ON时,所有与空值的比较都将得出UNKNOWN。当SET
ANSI_NULLS为OFF时,如果数据值为NULL,则将所有数据与null值的比较评估为TRUE。



 类似资料:
  • 问题内容: “&”在这里是什么意思: 问题答案: 这称为位掩码。它用于数字中各个位具有不同含义的情况,而不是数字仅表示数字本身(例如,如果您将年龄保存到数据库中)。 当您以二进制形式想象任何数字并想测试数字中是否设置了某个位时,可以通过对数字和要测试的位使用二进制AND运算符来对其进行测试,如下所示: 用二进制表示,这意味着以下内容(假设您的数字是25): 在这里您可以看到,第5位的数字(从下至上

  • 问题内容: 如何检查值(@param为空) 前任: 如果我想将比较值(IS NULL)替换为@param。如何才能做到这一点 如何实现? 问题答案:

  • 问题内容: 我有一个这样的表“ bla”: 如果我做SQL查询 我只得到ID为2的记录。我没有ID为3的记录,其中fk为空。我以为NULL!=4。看来这是错误的。 为什么会这样呢? 问题答案: 不等于任何东西。您需要明确接受null: 有关处理的更多信息,请参见使用NULL。

  • 问题内容: 我正在尝试比较两个表以在每个表中找到不在另一个表中的行。表1的groupby列用于在表1中创建2组数据。 表2只有一栏。 因此,表1在组2中具有值1,2,4,表2具有值1,3,4。 加入第2组时,我期望得到以下结果: 我可以使它起作用的唯一方法是在第一个联接中放置where子句: 第二个在“打开”中有一个过滤器: 谁能提出一种不在on子句中而是在where子句中使用过滤器的方法? 上下

  • 问题内容: 为什么有人在SQL子句中使用(通过连接字符串获得的两种SQL,无论哪种视图定义) 我在某个地方看到过,它将被用来防止SQL注入,但是看起来很奇怪。 如果进行注射,结果将与相同。 稍后编辑:视图定义中的用法如何? 谢谢您的回答。 仍然,我不明白为什么有人会使用这种构造来定义视图,还是在存储过程中使用它。 以这个为例: 问题答案: 如果条件列表在编译时未知,而是在运行时生成,则不必担心是否

  • WHERE 子句用于过滤记录。 SQL WHERE 子句 WHERE 子句用于提取那些满足指定标准的记录。 SQL WHERE 语法SELECT column_name,column_name FROM table_name WHERE column_name operator value; 演示数据库 在本教程中,我们将使用 RUNOOB 样本数据库。 下面是选自 "Websites" 表的数据