Bri*_*nan 10 null sql-server t-sql
所以基本上在 SQL Server 中,NULL 意味着没有值,因此无法比较它返回一些意外的结果。
例如,以下查询不会返回值为 NULL 的行,但我希望它返回:
SELECT *
FROM table
WHERE
(value != 26)
AND date IS NULL
AND last_modified >= '5/21/2014'
Run Code Online (Sandbox Code Playgroud)
我知道我可以做以下作为一种解决方法,但认真吗?每次我想包含它时,都必须添加括号并检查每个字段是否为空?看起来丑陋,不直观和疯狂。
SELECT *
FROM table
WHERE
(value != 26 OR value is null)
AND date IS NULL
AND last_modified >= '5/21/2014'
Run Code Online (Sandbox Code Playgroud)
我的意思是我知道 NULL 不是一个值,因此无法进行比较,但您不能推断它实际上绝对不是 26 吗?如果 26 是什么,NULL 是什么,什么都不是什么,那么 NULL 不是 26。对我来说似乎是合乎逻辑的。
有谁知道我如何以更简洁的方式在使用比较时在结果中包含空值,而不必每次都包含显式检查。同样关闭我的表上的空值绝对不是一种选择。
编辑:
我为什么不想像我展示的那样做的真正问题并没有暴露出来。所以就到这里了。我正在编写一个程序,让您构建对数据库表的查询,让用户动态创建过滤器等,基本上在一天结束时构建 SQL 语句并将结果显示给用户。用户选择的字段可以是给定数据库中的任何和/或所有字段,如果我必须逐字地将 ISNULL 检查放在每个字段上,这将非常低效,并使查看 SQL 变得非常难看。我的程序与表定义无关,这意味着我不在乎你的表中有什么,也不想知道你的表的定义是什么。我只是想让你选择一个表格,选择一些字段来过滤等于、不等于、在、不在等......
Sea*_*ser 10
首先,NULL 并不意味着“没有值”,它在 SQL Server 中意味着“未知值”。有一个名为 ANSI_NULLS 的会话设置可以使您的查询按照您希望的方式运行,但是,它已被弃用,并且在未来版本中将被强制启用(您似乎不喜欢):http://msdn .microsoft.com/en-us/library/ms188048.aspx
我明白你想要做什么,为了反驳我,我想问你是否看到过报告服务或 Cognos 之类的东西生成的任何查询?如果是这样,您将确切地看到您所描述的您不想做的事情。为什么?嗯,因为使用允许空值的模式,这就是这样做的方法。我并不是说这是一个超级棒的好主意,但它一直有效。
您的设计人员可以做的是检查该列是否甚至可以为空,如果是,则适当的逻辑可以对其进行步进并创建正确的查询。您还可以有诸如“此列可能为空,您想要这些值吗?”之类的选项。我不知道最终游戏本身,当逻辑一致性都被考虑在内时(例如这个),编写自己的动态查询工具是非常困难的。
我将继续对可能为空的列进行显式空检查,确保它看起来不是最好的,但它一直都在工作。
ANSI_NULL 设置选项现在可以使用,但不是一个好主意,尤其是在您不控制环境的情况下,而且稍后将强制设置为 ON 并导致错误,您无论如何都需要重新编写应用程序逻辑。这是 SQL Server 处理 NULL 的方式。
usr*_*usr 10
该NULL问题是与SQL一个棘手的问题。它基本上是一个错误,现在已经烧毁了地球上所有的 SQL 软件。我们必须处理它。
value <> 26 or value is null是实现这个逻辑的好方法。还有其他相同语义的表述。
如果您知道该值从不-1(例如)您可以说ISNULL(value, -1) <> 26. 从可读性的角度来看,我不认为这更好。它还可能导致优化器问题,因为此谓词可能不是 SARGable。value is null 是一个 SARGable 和可索引的谓词,与流行的看法相反。
SQL 有IS DINSTINCT FROM操作符,但 T-SQL 不支持。请花一点时间投票支持实施它的请求!这是一个纯粹的语法问题。优化器根本不需要改变。它已经在内部支持该运营商。
TL;DR:你现在的做法是正确的。和它一起生活。