T-SQL If condition inside select

T-SQL If condition inside select

我的情况有多个场景,我需要检查每个场景。如果两个或多个案例匹配,我需要连接结果。

我想的是,使用 CASE 语句,但我无法使用 CASE 语句连接多个场景。

所以我现在正在做的是,使用 if 语句。下面是我做的查询:

declare @result varchar(200)
set @result=''

;with cte as
(
select * from table 1
)

if(column 1=5) set @result=@result+'case1'
if(column 2=6) set @result=@result+'case2'
if(column 3=7) set @result=@result+'case3'
if(column 4=10) set @result=@result+'case4'


select *,@result from cte

所以在这里,我需要在 CTE 之后立即使用 Select 语句,但我不能在 select 语句中使用 IF/ELSE 语句。但我也不能将 CASE 语句与变量连接一起使用。

所以结果应该是这样的:

id | column 1 | column 2| column 3| column 4| Result
-----------------------------------------------------
 3 |   5      |   6     |   6     |   9      | case1;`case2
 4 |   4      |   7     |   7     |   10     | case2
 5 |   5      |   6     |   6     |   10     | case1;`case2; case4
 6 |   5      |   6     |   7     |   10     | case2;case2;case3;case4
 7 |   4      |   5     |   6     |   3      | No Result 

谁能帮我完成这个?

您可以在单个 SELECT 中连接多个 CASE:

SELECT 
  CASE WHEN 1=1 THEN 'Case1' ELSE '' END
+ CASE WHEN 2=2 THEN 'Case2' ELSE '' END
+ CASE ...

根据评论进行编辑:如果如您所说,使用 IF 的损坏代码确实可以解决您的问题,那么就没有问题,因为您使用的 if 语句不会需要在 SELECT 中。你可以简单地这样做:

declare @result varchar(200)
set @result=''

if(1=1) set @result=@result+'case1'
if(2=2) set @result=@result+'case2'


;with cte as
(
select * from table 1
)
select *,@result from cte

根据对原始问题的更新进行编辑:

所以我的第一个解决方案是正确的。您问题中的其他详细信息让我更清楚一点。顺便说一下,您根本不能为此使用变量:

;with cte as
(
select * ,
CASE WHEN column1=5 THEN 'case1' ELSE '' END +
CASE WHEN column2=6 THEN 'case2' ELSE '' END +
CASE WHEN column3=7 THEN 'case3' ELSE '' END +
CASE WHEN column4=10 THEN 'case4' ELSE '' END AS result
from table 1
)
select *,
CASE WHEN result='' THEN 'No Result Found' ELSE result END as result 
from cte

请注意,如果您需要用分号分隔值(如您的问题所示),您可以在每个值之前放置一个分号(示例 ';case3'),并在最后的 SELECT, 使用 STUFF() 删除第一个分号。

;WITH cte AS
(
    SELECT * FROM table1
)
SELECT *,(
    CASE
        WHEN Column1 <> 5 AND Column2 <> 6 AND Column3 <> 7 AND Column4 <> 10 THEN 'No Result'
        ELSE
            CASE WHEN Column1 = 5 THEN 'Case 1;' ELSE '' END +
            CASE WHEN Column2 = 6 THEN 'Case 2;' ELSE '' END +
            CASE WHEN Column3 = 7 THEN 'Case 3;' ELSE '' END +
            CASE WHEN Column4 = 10 THEN 'Case 4;' ELSE '' END
        END
)Result
FROM cte



| id | Column1 | Column2 | Column3 | Column4 |                       Result |
|----|---------|---------|---------|---------|------------------------------|
|  3 |       5 |       6 |       6 |       9 |               Case 1;Case 2; |
|  4 |       4 |       7 |       7 |      10 |               Case 3;Case 4; |
|  5 |       5 |       6 |       6 |      10 |        Case 1;Case 2;Case 4; |
|  6 |       5 |       6 |       7 |      10 | Case 1;Case 2;Case 3;Case 4; |
|  7 |       4 |       5 |       6 |       9 |                    No Result |

Check SQL Fiddle