我有这样的东西:

declare @cucu varchar(10)
select @cucu = 'c'

create table #t(id int, title varchar(50), p bit)
insert into #t(id, title, p) values (1, 'alpha', 0)
insert into #t(id, title, p) values (2, 'beta', 1)
insert into #t(id, title, p) values (3, 'gamma', 0)

if (@cucu = 'a')
begin
    select  *
    from    #t
    where   p = 0
end
else if (@cucu = 'b')
begin
    select  *
    from    #t
    where   p = 1
end
else
begin
    select  *
    from    #t
end

drop table #t

有没有办法在select * from #t个查询的第WHERE个问题上以CASE/WHEN/END的形式处理这3个病例?

如果我创建另一个变量,如下所示:

declare @b bit; select @b = 0; if @cucu = 'b' select @b = 1

那么在一个查询中处理前两个 case 就很简单了:

select  *
from    #t
where   p = @b

但对于第三种可能性,我不知道该怎么做

推荐答案

你需要使用ORAND从句.您可能还希望在OPTION子句中包含RECOMPILE,因为这3个查询的查询计划可能完全不同(因为我假设这将针对一个大得多的表运行):

SELECT id,
       title,
       p
FROM #t
WHERE (p = 0 AND @cucu = 'a')
   OR (p = 1 AND @cucu = 'b')
   OR (@cucu NOT IN ('a','b')) --Assumes @cucu isn't going to have a NULL value
OPTION (RECOMPILE);

Sql相关问答推荐

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

SQL:创建查询以添加减少的总数

从2个表中查找每条记录的唯一最接近的日期匹配

Group By子句返回太多行

我如何计算字母a出现的字符串的次数?

使用来自不同深度的嵌套组的值执行计算的干净方法?

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

如何嵌套两条SQL语句

SQL Select 最小优先级

使用多个嵌套数组查询JSON数据

SQL到Snowflake-转换嵌套的SELECT(值

比较SQL中以逗号分隔的字符串

使用多个WITH子查询的替代方法

替换SQL Server XML中多处出现的 node 值

删除对 JSON 数据的未解析引用的 SQL71502 警告

DB2 SQL查询结果多余数据

递归 CTE 附加为行

按公司和产品查询最近发票的平均价格的SQL查询

try 将多行折叠为单个结果

joins 组合多个重复数据删除策略