在(NULL)查询SQL服务器无法正常工作
问题描述:
当我定义了一个“用户自定义表类型”,如:在(NULL)查询SQL服务器无法正常工作
CREATE TYPE [dbo].[BitType] AS TABLE(
[B] [bit] NULL
)
我在这个表变量放在0和空。 后来我做这个查询:
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)
答
与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)
答
空不等于空在SQL Server(和大多数其他数据库管理系统)。您需要在连接的列上进行合并,并使用标记值来表示空值。
答
有一个作弊使用isnull
被比较的项目。
如
SELECT something
FROM theTable
WHERE ISNULL(item,0) IN (0)
好主意,所以,而不是创建BitType,也许我需要创建一个TinyintType表变量,然后我不需要施放。将尝试 – 2012-01-05 05:13:48
是的,数据类型的大小是一样的,所以你不会失去性能,但会增加多功能性 – 2012-01-05 05:14:49
其他比较*不*返回'false',它们返回'未知'。如果在这样的比较中放置一个“NOT()” - “NOT(1 = NULL)”不是“true”,那么区别很明显。 – 2012-01-05 07:05:44