当我将"用户定义的表类型"定义为:时
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 NULL
或IS 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)