【问题标题】:SQL Query Where Clause for Null OR Match (only return 1)?SQL 查询空或匹配的 Where 子句(仅返回 1)?
【发布时间】:2009-09-04 08:56:32
【问题描述】:

我有一个表,其记录的结构与此类似..

ID RoleID
1 空
2 15
3 16

我写了一个 where 子句来获取如下记录

SELECT * from TableX 
WHERE (RoleID = 2 OR RoleID IS NULL)

这让我得到了“1,NULL”的记录

但是如果我查询

SELECT * from TableX 
WHERE (RoleID = 15 OR RoleID IS NULL)

我返回“1,NULL”和“2,15”。

有谁知道如何构造一个只给我一条记录的选择?如果通过了 15,我只想要“2,15”,如果没有匹配,我只想要“1,NULL”。

注意,实际的查询有更多的 where 子句,因此将自身嵌套在自身内部将是一个非常大的查询。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    用 ORDER BY RoleID DESC SELECT TOP 1 怎么样

    这是一个工作示例。

    declare @mytable table
    (
        ID int null,
        RoleID int null
    )
    insert @mytable values
    (1, null),
    (2, 15),
    (3, 1)
    
    select TOP 1 * 
    from @mytable 
    WHERE (RoleID = 2 OR RoleID IS NULL)
    order by RoleID desc
    
    
    select top 1 * from @mytable 
    WHERE (RoleID = 15 OR RoleID IS NULL)
    order by RoleID desc
    

    编辑(根据收到的 cmets 进行编辑)
    请注意,Insert 语句仅适用于 SQL Server 2008。对于 2008 之前的版本,您必须将其分解为单独的插入。

    【讨论】:

    • +1,我喜欢你的示例代码。此外,INSERT 语法是 SQL Server 2008 语法 如果您尝试在旧版本上运行它,则需要 3 个 INSERT
    • 谢谢!我整个早上都在使用 TOP 1 来查看我的表的字段,不知道为什么我没有为查询本身考虑它。
    【解决方案2】:
    order by RoleID limit 1
    

    【讨论】:

    • 这不是有效的 SQL Server 语法
    【解决方案3】:
    SELECT TOP 1 * from TableX WHERE (RoleID = 15 OR RoleID IS NULL)
    ORDER BY RoleID DESC
    

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多