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 |
我的情况有多个场景,我需要检查每个场景。如果两个或多个案例匹配,我需要连接结果。
我想的是,使用 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 |