如何在 SQL Server 中的 OR 条件中确定优先级

Posted

技术标签:

【中文标题】如何在 SQL Server 中的 OR 条件中确定优先级【英文标题】:How to prioritize in OR condition in SQL Server 【发布时间】:2015-07-15 10:47:35 【问题描述】:

我有一个简单的查询,我想在列中搜索一个值,如果没有找到匹配项,那么我想丢弃 where 条件并从该列中选择任何随机值。

我尝试使用OR 条件,使用案例来实现这一点,但无济于事

select top 10 * 
from tblRFCWorkload 
where (f1 ='mbb' or f1 = f1)

在上面的查询中,我希望结果表的所有行都带有“mbb”,如果没有找到“mbb”,则给出任何值而不是 mbb。但是,即使有 10 行匹配,它也只返回两行 mbb

select top 10 *
from tblRFCWorkload
where 1 = case when f1 = 'mbb' then 1 else 1 end

此查询也返回与第一个查询相同的结果

如果我把它改成

select top 10 *
from tblRFCWorkload
where 1 = case when f1 = 'mbb' then 1 else 0 end

那么它只有具有 mbb 值的行。

需要与 between 子句类似的东西...如果没有找到结果,则搜索一个范围然后搜索第二个范围...我该怎么做???

【问题讨论】:

现在我希望对操作符之间做同样的事情......如果没有找到第一个范围的值,那么只能按第二个范围过滤..我该怎么做? 【参考方案1】:

我想你想要这样的东西:

select top 10 *
from tblRFCWorkload
order by (case when f1 = 'mbb' then 1 else 2 end);

这会优先处理您想要的行,获取前 10 个行,即 'mbb'(如果可用)。

【讨论】:

@rashminashaikh 如果它解决了您的问题,请随时接受这个答案。【参考方案2】:

您只想要f1 = 'mbb' 的结果(如果有的话),否则什么都没有?在这种情况下,您需要测试是否有任何匹配的行。像这样的

SELECT TOP 10 *
FROM tblRFCWorkload 
WHERE f1 = 'mbb'      --the match you need
OR NOT EXISTS         --or there are no matches
    (SELECT * FROM tblRFCWorkload WHERE f1 = 'mbb')

【讨论】:

以上是关于如何在 SQL Server 中的 OR 条件中确定优先级的主要内容,如果未能解决你的问题,请参考以下文章

根据 SQL Server 中的条件计数

数据库中的表总是会出现查询的数据都为null或者为空,但是数据表中确实有数据存在

如何根据多个条件从 SQL Server 中删除大量数据

SQL Server 中的条件条件

如何在不使用循环的情况下更新 SQL Server 中两组不同条件之间的行

SQL Server - 条件语句的查询执行计划