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

时间:2012-01-05 04:54:54

标签: sql sql-server sql-server-2008 tsql table-variable

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

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值。如何正确执行查询以获得包含空项的结果。

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

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

答案 2 :(得分:1)

对要比较的项目使用作弊isnull

例如

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