7

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

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

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

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

所以,我的问题是,如果我喜欢使用User-Defined Table Type,但我还需要使用 NULL 值。如何正确执行查询以获取包含空项的结果。

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

4

3 回答 3

5

NULL与值的唯一有效比较操作是IS NULLor 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)
于 2012-01-05T05:08:46.993 回答
5

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

于 2012-01-05T04:58:25.480 回答
3

被比较的物品有作弊用途isnull

例如

SELECT something 
FROM theTable 
WHERE ISNULL(item,0) IN (0)
于 2012-01-05T05:03:14.017 回答