T-SQL If条件内部选择

时间:2019-03-18 17:52:33

标签: sql sql-server msbi

我有一个条件,其中有多个场景,我需要检查每个场景。如果两个或多个案例匹配,我需要将结果连接起来。

我原以为是使用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 

任何人都可以帮助我完成此工作吗?

2 个答案:

答案 0 :(得分:2)

您可以在单个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 ()删除第一个分号。

答案 1 :(得分:0)

;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