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



当我将"用户定义的表类型"定义为:时

CREATE TYPE [dbo].[BitType] AS TABLE(
    [B] [bit] NULL
)

我将0和null放在这个表变量中。然后我做这个查询:

SELECT something FROM theTable WHERE item IN @theBitTypeTable

将只获得item=0而不是item is null

简单地说:SELECT something FROM theTable WHERE item IN (0, NULL)不工作(尽管没有错误)必须是SELECT something FROM theTable WHERE item=0 OR item IS NULL

因此,我的问题是,如果我喜欢使用用户定义的表类型,但我也需要使用NULL值。如何正确执行查询以获得包含null项的结果。

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

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)

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

在被比较的项目上存在欺骗使用isnull

例如

SELECT something 
FROM theTable 
WHERE ISNULL(item,0) IN (0)

最新更新