繁体   English   中英

如何在 select 语句中使用 if else

[英]How to use if else inside select statement

我有一个下面给出的存储过程,我想在选择查询中使用 if else

ALTER PROCEDURE updatepriority
    @sort smallint
AS 
BEGIN
    SELECT    
        Request.SubmitTime, Request.CommitTime, 
        (CASE WHEN Priority.Priority = 'Live Demo' THEN 1 WHEN Priority.Priority = 'Priority Re-do' THEN 2 ELSE 3 END) AS Sort1,
END

@sort = 1我想使用另一个case语句并且我不想将整个语句包含在if else中

像下面的东西

IF (@sort = 1)
BEGIN
    (CASE WHEN Priority.Priority = 'Live Demo' THEN 1 WHEN Priority.Priority = 'Priority Re-do' THEN 2 ELSE 3 END) AS Sort1,
END
ELSE
BEGIN
    (CASE WHEN Priority.Priority = 'Live Demo' THEN 1 WHEN Priority.Priority = 'Conditional Live' THEN 2 WHEN Priority.Priority = 'Priority Re-do' THEN 3 ELSE 4 END) AS Sort1,
END

但是上面的查询会抛出一个错误,因为我们不能在 select 语句中使用 if else

是的,在sql server中没有else ,但是您可以使用它。

if(@sort=1)

BEGIN
    SELECT    Request.SubmitTime, Request.CommitTime, 
          (CASE WHEN Priority.Priority = 'Live Demo' THEN 1 WHEN Priority.Priority = 'Priority Re-do' THEN 2 ELSE 3 END) AS Sort1 ....
END

if(@sort!=1)
BEGIN
    SELECT    Request.SubmitTime, Request.CommitTime, 
          (CASE WHEN Priority.Priority = 'Live Demo' THEN 1 
            WHEN Priority.Priority = 'Conditional Live' THEN 2 
            WHEN Priority.Priority = 'Priority Re-do' THEN 3 ELSE 4 END) AS Sort1,
 ....
END

如果你真的不想在两个 if/else 分支中都使用 select 语句,那么唯一的选择是对 CASE 程序集使用动态 SQL,如下所示:

create table #test (
    Priority varchar(30)
);

insert #test (Priority)
values 
    ('Live Demo'), 
    ('Priority Re-do'), 
    ('Conditional Live'), 
    ('ABC');

declare @sort smallint = 1;
declare @sqlStmt varchar(max);

if(@sort=1)
BEGIN
    set @sqlStmt = '
    (CASE 
        WHEN Priority.Priority = ''Live Demo'' THEN 1 
        WHEN Priority.Priority = ''Priority Re-do'' THEN 2 
        ELSE 3 END) AS Sort1';

END
ELSE
BEGIN
    set @sqlStmt = '
    (CASE 
        WHEN Priority.Priority = ''Live Demo'' THEN 1 
        WHEN Priority.Priority = ''Conditional Live'' THEN 2 
        WHEN Priority.Priority = ''Priority Re-do'' THEN 3 
        ELSE 4 END) AS Sort1';
END

set @sqlStmt = 'select Priority.Priority, ''SubmitTime'' as SubmitTime, ' + @sqlStmt + ' from #test as Priority order by Sort1';

exec (@sqlStmt); 

当然,你可以只取你需要的(sql 动态部分..)。

你只需要嵌套CASE来做一些布尔逻辑

SELECT    
  Request.SubmitTime,
  Request.CommitTime,
  CASE WHEN @sort = 1 THEN
      CASE WHEN Priority.Priority = 'Live Demo' THEN 1
           WHEN Priority.Priority = 'Priority Re-do' THEN 2
           ELSE 3
      END
  ELSE
      CASE WHEN Priority.Priority = 'Live Demo' THEN 1
           WHEN Priority.Priority = 'Conditional Live' THEN 2
           WHEN Priority.Priority = 'Priority Re-do' THEN 3
           ELSE 4
      END
  END AS Sort1,
....

你甚至可以将两个分支结合起来,让它更简洁,但上面的方法是最直接的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM