SQL 查询Where 子句为空或匹配(仅返回1)?

标签 sql sql-server t-sql

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

ID角色ID
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 子句,因此将自身嵌套在自身内部将是一个非常大的查询。

最佳答案

如何使用 ORDER BY RoleID DESC 来选择 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

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

关于SQL 查询Where 子句为空或匹配(仅返回1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374751/

相关文章:

mysql - 从一列中减去另一列总和的查询

sql - 将 Object_id() 函数与 #tables 一起使用

sql-server - 在 SQL 中用外部节点包装内部 XML 节点

sql-server - 从多个表和整数列表中插入 SQL

sql <> 不适用于日期时间

sql - 在 Azure SQL 数据库上设置可信属性

php - 使用 php/MySQL 的定时事件

sql-server - 如何处理 SQL 列名中多余的方括号

SQL扫描表更新值

sql - 如何从这段丑陋的代码中重写 "where, and, or"语句