Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MyNullableCol“MyValue”不包括MyNullableCol为NULL的行_Sql Server_Sql Server 2008_Nullable - Fatal编程技术网

Sql server MyNullableCol“MyValue”不包括MyNullableCol为NULL的行

Sql server MyNullableCol“MyValue”不包括MyNullableCol为NULL的行,sql-server,sql-server-2008,nullable,Sql Server,Sql Server 2008,Nullable,今天我发现了一个奇怪的问题,就是我有一个带有可空列的表,我尝试使用以下查询 挑选* 身份证件 麦考尔, 来自dbo。[MyTable] 其中MyNCol“MyValue” 并希望它返回字段MyNCol中没有“MyValue”值的所有行。但它不会返回上面指定的ColumnMyNCol中包含NULL的所有行。 因此,我必须将我的查询重写为 挑选* 身份证件 麦考尔, 来自dbo。[MyTable] 其中MyNCol“MyValue”或MyNCol为空 现在我的问题是为什么第一个查询不足以执行我想要的

今天我发现了一个奇怪的问题,就是我有一个带有可空列的表,我尝试使用以下查询

挑选* 身份证件 麦考尔, 来自dbo。[MyTable] 其中MyNCol“MyValue”

并希望它返回字段MyNCol中没有“MyValue”值的所有行。但它不会返回上面指定的ColumnMyNCol中包含NULL的所有行。 因此,我必须将我的查询重写为

挑选* 身份证件 麦考尔, 来自dbo。[MyTable] 其中MyNCol“MyValue”或MyNCol为空

现在我的问题是为什么第一个查询不足以执行我想要的操作:

问候
不能对空值执行Mubashar

相等运算符。在SQL 2000中,您可以检查null=null,但是在2005年,这种情况发生了变化。

查看ANSI null的行为

标准为空!=无效的您可以通过更改数据库上的ANSI NULLS enabled属性来更改此行为,但这会对列存储和查询执行产生广泛的影响。或者,您可以在SQL脚本中使用SET ANSIU NULLS语句

SQL Server 2008的MSDN文档如下:


请特别注意如何执行比较的详细信息-即使在禁用ANSI_NULLS时,列与列之间的比较也可能无法按预期进行。最佳做法是始终使用is NULL和is NOT NULL。

NULL=UNKNOWN。因此,您既不能说MyNCol='My Value'也不能说MyNCol'My Value'-两者的计算结果都是未知的,就像'foo'+MyNCol仍然会变为NULL一样。您发布的解决方案的替代方案是:

WHERE COALESCE(MyNCol, 'Not my Value') <> 'My Value';

这将包括空列,因为比较将变为false而不是未知。我不太喜欢这个选项,因为它依赖于比较中的一些魔法值,即使只有当列为空时才会提供魔法值。

谢谢你的回答,是的,你是对的,我不这么认为。但是你认为我的第二个问题更好,还是你说话的方式更好?这样或那样对你或你的团队更有意义吗?