Tsql 为什么(Col<;>;value和Col为null)不返回任何null?

Tsql 为什么(Col<;>;value和Col为null)不返回任何null?,tsql,sql-null,Tsql,Sql Null,我有一个应用程序,用户可以从页面上选择各种选项,其背后的代码构建一个SQL查询以返回相关记录 在这种情况下,用户已选择: 除法1' 还有一个自动限制,即返回记录的分区必须在UserDivisions中,这是一个如下所示的变量 Division IS NULL OR Division IN ('1','1.1','1.1.1') Select top 1000 Division, WoNum, WoType From WorkOrder Where (Division IS NULL OR

我有一个应用程序,用户可以从页面上选择各种选项,其背后的代码构建一个SQL查询以返回相关记录

在这种情况下,用户已选择:

  • 除法1'
还有一个自动限制,即返回记录的分区必须在UserDivisions中,这是一个如下所示的变量

Division IS NULL OR Division IN ('1','1.1','1.1.1')
Select top 1000 Division, WoNum, WoType 
From WorkOrder
Where (Division IS NULL OR Division IN ('1','1.1','1.1.1'))
AND (Division <> '1')
因此,返回的记录必须位于列出的分区之一,或者具有NULL值

我的代码目前正在分别处理这些限制,因此最终的SQL如下所示

Division IS NULL OR Division IN ('1','1.1','1.1.1')
Select top 1000 Division, WoNum, WoType 
From WorkOrder
Where (Division IS NULL OR Division IN ('1','1.1','1.1.1'))
AND (Division <> '1')
选择前1000名、WoNum、WoType
从工作订单
式中(除法为空或在('1','1.1','1.1.1')中除法)
及(第1分部)
此查询返回所有Division='1.1'和'1.1.1'的记录,它不会像应该的那样返回任何Division'1'中的记录,但也不会返回任何Division=Null的记录

如何构建此查询以同时返回空值,以及为什么上面的查询不返回空值?
和(除法“1”)
消除空值。这是因为null不能计算为“1”。RDBMS返回“未定义”。Undefined不正确,将被排除

你可以这样做;但这看起来很奇怪,因为你想要除法1,然后排除它

其中((('1'、'1.1'、'1.1.1')中的除法)和(除法'1'))或除法为空)

将空值与值进行比较时,它总是返回未定义的值 …不正确,因此评估为错误。因此
和(除法“1”)
将从返回集中删除所有空值

执行相同查询但包含空值的某些方法:

  • 其中(除法为空或在('1','1.1','1.1.1')中除法)
    和(分区“1”或分区为空)

  • 其中((‘1’、‘1.1’、‘1.1.1’)和(‘1’)中的除法)或除法为空)

  • 其中(ISNULL(除法“)“1”)
    和(除法为空或在('1','1.1','1.1.1')中除法)

  • 其中(合并(分割),“1”)
    和(除法为空或在('1','1.1','1.1.1')中除法)

这在功能上相当于

  • 其中(如果除法为空,则为“”否则除法结束)'1'
    和(除法为空或在('1','1.1','1.1.1')中除法)

和(除法“1”)
消除空值。因为null不能计算为“1”,所以返回“undefined”undefined不是真的并被排除。@xQbert为什么它会消除null?不是空值!='1'太多?与空值的比较总是失败的。这就是为什么在第一个条件中,
除法为NULL或需要使用
。实际上,
分区“1”
将在任何情况下失败NULLs@GreySage不,
NULL
不表示任何内容。你无法与任何事物相比something@PanagiotisKanavos除1在第一组中,但被第1组排除在外。最好是('1.1','1.1.1')中的
划分
,但我要说的是,由于它是动态构建的,所以先包含后排除动态逻辑,从技术上讲,这不是错误的,也不是正确的,它是未定义的。但是,由于引擎查找的是真的,而不是真的,因此它会被忽略。