T-SQL Если условие внутри выбрать - PullRequest
1 голос
/ 18 марта 2019

У меня есть условие, когда есть несколько сценариев, и мне нужно проверить каждый сценарий.Мне нужно объединить результат, если два или более совпадений совпадают.

То, что я думал, было с помощью оператора 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

Так что здесь, мне нужно использовать оператор Select сразу после CTE, но я не могу использовать оператор IF / ELSE в операторе select.Но я также не могу использовать оператор CASE с переменной concatenate.

Таким образом, результат должен выглядеть следующим образом:

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 ]

2 голосов
/ 18 марта 2019

Вы можете объединить несколько CASE в один SELECT:

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 () удалить первую точку с запятой.

0 голосов
/ 18 марта 2019
;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 |

Проверка скрипта SQL

...