2009-10-21 9 views
2

En C# nous pouvons écrirefallthrough SQL CASE Déclaration

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

Comment puis-je obtenir le même genre de choses dans SQL Server?

Je ne parle pas de la manière simple d'écrire CASE dans SQL SERVER. Je parle si j'ai besoin d'effectuer le même roi d'opération dans 2 cas ou plus que ce que j'ai montré dans l'extrait de code C#, comment faire le genre de choses similaires dans le CAS de SQL?

EDIT:

J'ai eu quelques réponses belles d'ici déjà. Comment puis-je convertir les éléments suivants

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] 

... en quelque chose comme:

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

En fait, je besoin de cela dans une requête PIVOT. La nuit dernière, j'ai résolu le problème. Mais je ne suis pas convaincu par cette manière d'écrire. Parce que chaque fois, je fais la même chose. Alors, y a-t-il une meilleure façon de présenter cela?

+0

Vous ne savez pas exactement de quel comportement vous parlez. L'instruction switch que vous avez (une fois que nous avons ajouté les ruptures nécessaires pour la compiler) correspond directement à une simple instruction de requête TSQL. Essayez de fournir un C# qui compile et dont vous voulez répliquer le comportement. –

+1

Notez que C#, FWIW, ne prend pas en charge les chutes. –

+0

Je sais que c'est un peu en retard, mais vous pouvez utiliser une expression logique comme 'ou' dans une instruction when pour introduire plusieurs conditions traitées par la même action. – deutschZuid

Répondre

4

Vous cherchez peut-être cela.

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

Je comprends .. mais comment il faut mettre dans votre format SELECT \t \t CASE QUAND \t [A] = num THEN '-' AUTRE '' END [A] \t \t \t, CASE WHEN \t [B] = num THEN 'X' AUTRE '' END [B] \t \t \t, CASE WHEN \t [C] = num THEN 'X' AUTRE '' END [C] \t \t \t, CASE WHEN \t [D] = num THEN ' X 'ELSE' 'END [D] –

+0

Je pense que vous l'avez aussi proche que vous pouvez l'obtenir, si vous voulez retourner quatre colonnes distinctes. –

1

Comme ceci:

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

Bien - je me demande s'il me manque quelque chose. Dans votre code C#, vous ne gérez qu'un seul CAS, comme dans cette requête. Si vous voulez du code procédural, alors vous devriez utiliser IF, mais vous devriez essayer de retravailler votre code en une seule requête si vous le pouvez. –

+0

Je pense qu'il parle de CAS QUAND num = 1 OU num = 2 ALORS ... –

+0

Non non .. Je ne cherche pas cela .. Il est parfait mais je veux écrire un 1-1 alors pour un QUAND, peut nous faisons quelque chose comme CASE num Quand 0 Quand 1 .... Est-ce possible? –

2

SQL supporte une instruction CASE mais ce n'est pas la même chose que la déclaration switch dans des langages de haut niveau comme C# et Java. Dans une instruction de commutateur, vous avez le concept de porte-à-faux où si une instruction break n'est pas rencontrée, le flux continue à case suivant. En revanche, une instruction SQL CASE se comporte comme un if(value==1){ ... }else if(value==2){ ... }else{ ... } de langage de haut niveau.

+0

Oui, vous avez raison. J'ai aussi cherché la même chose sur le net mais sans réponse. J'ai donc posté ici juste pour m'assurer de cela. Merci beaucoup. –

+0

Cela n'a rien à voir avec le niveau élevé contre le niveau bas, cependant. Et je dirais même que SQL est le langage de plus haut niveau dans ce cas. –

2

Comme C# déclaration SWITCH, le cas de SQL Server expression ne pas fallthrough de soutien.

Notez l'accent sur expression - il ne doit pas être utilisé pour le contrôle du flux, utilisez ce qui est listed here.