2012-01-05 70 views
3

当我定义了一个“用户自定义表类型”,如:在(NULL)查询SQL服务器无法正常工作

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

我在这个表变量放在0和空。 后来我做这个查询:

SELECT something FROM theTable WHERE item IN @theBitTypeTable 

只会item=0item 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)

回答

4

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) 
+0

好主意,所以,而不是创建BitType,也许我需要创建一个TinyintType表变量,然后我不需要施放。将尝试 – 2012-01-05 05:13:48

+0

是的,数据类型的大小是一样的,所以你不会失去性能,但会增加多功能性 – 2012-01-05 05:14:49

+1

其他比较*不*返回'false',它们返回'未知'。如果在这样的比较中放置一个“NOT()” - “NOT(1 = NULL)”不是“true”,那么区别很明显。 – 2012-01-05 07:05:44

4

空不等于空在SQL Server(和大多数其他数据库管理系统)。您需要在连接的列上进行合并,并使用标记值来表示空值。

1

有一个作弊使用isnull被比较的项目。

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