【问题标题】:Query SQL Server with IN (NULL) not working使用 IN (NULL) 查询 SQL Server 不起作用
【发布时间】:2012-02-03 00:02:57
【问题描述】:

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

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)

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql table-variable


    【解决方案1】:

    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)
    

    【讨论】:

    • 好主意,所以不用创建 BitType,也许我需要创建一个 TinyintType 表变量,然后我不需要强制转换。会尝试
    • 是的,数据类型的大小是一样的,所以你不会损失性能,但会获得多功能性
    • 其他比较返回false,它们返回unknown。如果您将NOT() 放在这样的比较周围,差异就很明显了——NOT (1=NULL) 不是true
    • @Damien_The_Unbeliever:其他比较不返回 UNKNOWN,它们评估为UNKNOWN,例如postgreSQL 部分支持标准 SQL 的 BOOLEAN 类型,但使用 NULL 作为 UNKNOWN 的占位符,因此对于该产品,可以说此类比较评估为 UNKNOWN(逻辑值)但 return NULL(一个数据值)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      例如

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 2013-09-18
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        相关资源
        最近更新 更多