2009-10-21 4 views
2

В C# можно написатьпроваливается саз в SQL

switch(num) 
{ 
    case 0: 
    case 1: // do something; break; 
    case 2: 
    ............ 
    ........... 
    case n: // do something break; 
    default: //do something; break; 
} 

Как я могу добиться подобного рода вещей в SQL SERVER?

Я не говорю о простом способе написания CASE в SQL SERVER. Я говорю о том, нужно ли мне выполнять один и тот же король операции в 2 или более случаях как то, что я показал в фрагменте кода на C#, как делать подобные вещи в CASE SQL?

EDIT:

Я получил некоторые хорошие ответы здесь уже. Как я могу преобразовать следующие

SELECT CASE 
     WHEN [A]= num THEN '-' ELSE '' END [A], 
     CASE WHEN [B]= num THEN '-' ELSE '' END [B], 
     CASE WHEN [C]= num THEN '-' ELSE '' END [C], 
     CASE WHEN [D]= num THEN '-' ELSE '' END [D] 

... во что-то вроде:

SELECT CASE WHEN [A], 
     CASE WHEN [B], 
     CASE WHEN [C], 
     CASE WHEN [D] = num THEN '-' ELSE '' END [A] or [B] or [C] or [D] 

На самом деле мне это нужно в запросе PIVOT. Вчера вечером я решил проблему. Но я не уверен в этом письме. Потому что каждый раз я делаю то же самое. Так есть ли лучший способ представить это?

+0

Не знаете, о каком поведении вы говорите. Выведенный оператор switch (как только мы добавляем перерывы, необходимые для его компиляции) сопоставляет непосредственно простой оператор TSQL. Попробуйте предоставить некоторые C#, которые компилируются, и чье поведение вы хотите реплицировать. –

+1

Обратите внимание, что C#, FWIW, не поддерживает провал. –

+0

Я знаю, что это немного поздно, но вы можете использовать логическое выражение типа «или» в инструкции when, чтобы ввести несколько условий, с которыми связано одно и то же действие. – deutschZuid

ответ

4

Возможно, вы ищете.

SELECT 
     CASE 
     WHEN (num BETWEEN 0 AND 2) THEN 'Between 0 and 2' 
     WHEN (num = 3) THEN '3' 
     ELSE 'Something else' 
     END 
... 

More information on CASE from MSDN.

+0

я понимаю .. но как поместить следующее в ваш формат ВЫБРАТЬ \t \t \t случай, когда [A] = Num THEN '-' ELSE '' END [A] \t \t \t, случай, когда \t [B] = Num ТО 'X' ELSE '' КОНЕЦ [В] \t \t \t, случай, когда \t [С] = Num ТО 'X' ELSE '' КОНЕЦ [С] \t \t \t, случай, когда \t [D] = Num ТОГДА ' X 'ELSE' 'END [D] –

+0

Я думаю, что у вас есть это как можно ближе, если вы хотите вернуть четыре отдельных столбца. –

1

Как это:

SELECT 
    CASE num 
    WHEN 0 THEN ... 
    WHEN 1 THEN ... 
    ELSE ... 
    END as SomeCol 
FROM ... 
+0

Хотя ... мне интересно, не хватает ли я чего-то. В коде C# вы обрабатываете только один CASE, как в этом запросе. Если вам нужен процедурный код, тогда вы должны использовать IF, но вам следует попытаться переработать код в один запрос, если сможете. –

+0

Я думаю, что он говорит о CASE КОГДА num = 1 ИЛИ num = 2 THEN ... –

+0

Нет, нет. Я не ищу этого .. Это прекрасно, но я хочу, чтобы писать 1-1 THEN для КОГДА, может мы делаем что-то вроде CASE num Когда 0 Когда 1 ТОГДА .... Возможно ли это? –

2

SQL делает поддержку CASE заявление, но это не то же самое, что и switch заявление на языках высокого уровня, таких как C# и Java. В заявлении коммутатора вы имеете концепцию падения, если оператор break не встречается, поток продолжается до следующего case. Напротив, оператор SQL CASE ведет себя как язык высокого уровня if(value==1){ ... }else if(value==2){ ... }else{ ... }.

+0

Да, вы правы. Я также искал то же самое в сети, но без ответа. Поэтому я разместил здесь только для этого. Большое спасибо. –

+0

Это не имеет ничего общего с высоким уровнем и низким уровнем. И я бы даже утверждать, что SQL является языком более высокого уровня в этом случае. –

2

заявление # ПЕРЕКЛЮЧАТЕЛЯ Как C, CASE в SQL Server выражение делает не поддержки проваливается.

Обратите внимание, что упор на выражение - его нельзя использовать для контроля потока, используйте то, что listed here.