使用IN(NULL)查询SQL Server不起作用

Eri*_*Yin 4 sql t-sql sql-server table-variable sql-server-2008

当我定义“用户定义的表类型”时,为:

CREATE TYPE [dbo].[BitType] AS TABLE(
    [B] [bit] NULL
)
Run Code Online (Sandbox Code Playgroud)

我将0和null放在此表变量中。然后我执行以下查询:

SELECT something FROM theTable WHERE item IN @theBitTypeTable
Run Code Online (Sandbox Code Playgroud)

只会得到item=0item is null

简而言之:SELECT something FROM theTable WHERE item IN (0, NULL)不起作用(尽管没有错误)SELECT something FROM theTable WHERE item=0 OR item IS NULL

所以,我的问题是,如果我想使用User-Defined Table Type,但我还需要使用NULL值。如何正确执行查询以获取包含空项目的结果。

谢谢(顺便说一句,我使用MS SQL Server 2008 R2)

Chr*_*ain 5

在 SQL Server(以及大多数其他数据库管理系统)中,Null 不等于 null。您需要对连接列进行合并,并使用哨兵值来表示空值。


Ole*_*Dok 5

唯一具有NULL值的有效比较操作为IS NULLIS NOT NULL,其他操作始终返回false(实际上-未知,请参见@Damien_The_Unbeliever的注释)

因此,请尝试以下

CREATE TYPE [dbo].[BitType] AS TABLE(
    [B] [tinyint] NOT NULL
)
GO
declare @theBitTypeTable BitType

insert @theBitTypeTable
VALUES(0), (2 /* instead of NULL*/)

SELECT something FROM theTable WHERE IsNull(cast(item as tinyint), 2) IN (select B from @theBitTypeTable)
Run Code Online (Sandbox Code Playgroud)