当我定义“用户定义的表类型”时,如:
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)
答案 0 :(得分:5)
唯一有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)
答案 1 :(得分:4)
Null在SQL Server(以及大多数其他数据库管理系统)中不等于null。您需要在连接列上进行合并,并使用sentinel值来表示空值。
答案 2 :(得分:1)
对要比较的项目使用作弊isnull
。
例如
SELECT something
FROM theTable
WHERE ISNULL(item,0) IN (0)