2010-10-31 9 views
0

J'ai un grand choix dans une requête SQL.SQL Server Case when syntax

(select case tb_usuario.int_id_cargo 
        when 13 
        then '20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53' 
        when 20 
        then '' 
        when 21 
        then '20' 
        when 22 
        then '' 
        when 23 
        then '22' 
        when 24 
        then '20,21,22,23' 
        when 25 
        then '20,21,22,23,24' 
        when 26 
        then '20,21,22,23,24,25' 
        when 27 
        then '' 
        when 28 
        then '27' 
        when 29 
        then '' 
        when 30 
        then '29' 
        when 31 
        then '27,28' 
        when 32 
        then '27,28,31' 
        when 33 
        then '29,30' 
        when 34 
        then '27,28,29,30,31,32,33' 
        when 35 
        then '' 
        else '' 
        end) as subs 

Si vous faites attention vous vous rendrez compte il y a de nombreux cas qui renvoient un string.I vide voudrait vérifier ceux qui retournent une chaîne vide dans un seul cas, à savoir:

(select case tb_usuario.int_id_cargo 
         when 20,22,27,29,35 
             then '' 
             [...] 

Est-ce possible?

Répondre

3

Que diriez-vous d'utiliser une table (temporaire) pour que ces valeurs soient sélectionnées sans utiliser une instruction CASE?

migration (table name) 
old_id  new_id 
--------- -------------- 
24   20,21,22,23 
30   29 
..... 

et votre requête ressemblera

select migration.new_id 
from migration inner join tb_usuario 
on migration.old_id = tb_usuario.int_id_cargo 

EDIT: Pour plusieurs pointage old_id à new_id avec une chaîne vide, vous devez créer pour par exemple les entrées séparément

(En supposant que old_id 1 & 2 points à new_id -> blanc)

migration (table name) 
old_id  new_id 
--------- -------------- 
1   
2 

Cela aura un avantage de changer la new_id de vide à quelque chose d'autre en utilisant ce tableau que de changer la requête écrite ci-dessus.

+0

Ceci est une solution plus élégante et pourrait être ce que user257234 devrait considérer de toute façon. Ce qu'il a écrit sera une ÉFVP à gérer si ces valeurs sont sujettes à changement. – Vinnie

+0

Comment cela traite-t-il de l'option chaîne de longueur zéro? –

+0

@OMG Poneys: S'il vous plaît voir la modification pour la réponse à votre question. – shahkalpesh

0
select (case 
     when tbl_usuario.int_id_cargo in (20,22,27,29,35,.....) then '' 
     else 
      case tbl_usuario.int_id_cargo 
      when 23 then '22' 
      when 25 then '20,21,22,23,24' 
      when .... 
      end 
     end) as subs 

.... le remplacer reste des ids puis fixer la deuxième déclaration de cas afin que les appariements pour toutes les autres valeurs

2

Je voudrais juste laisser à la clause ELSE. Ne nommez que les ID que vous souhaitez associer dans l'instruction CASE. Sauf si vous avez une raison de conserver ces identifiants dans l'instruction.

(select case tb_usuario.int_id_cargo 
        when 13 
        then '20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53' 
        when 21 
        then '20' 
        when 23 
        then '22' 
        when 24 
        then '20,21,22,23' 
        when 25 
        then '20,21,22,23,24' 
        when 26 
        then '20,21,22,23,24,25' 
        when 28 
        then '27' 
        when 30 
        then '29' 
        when 31 
        then '27,28' 
        when 32 
        then '27,28,31' 
        when 33 
        then '29,30' 
        when 34 
        then '27,28,29,30,31,32,33' 
        else '' 
        end) as subs 
1

Utilisation:

(SELECT CASE 
     WHEN tb_usuario.int_id_cargo = 13 THEN 
      '20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53' 
     WHEN tb_usuario.int_id_cargo IN(20, 22, 27, 29, 35) THEN 
      '' 
     WHEN tb_usuario.int_id_cargo = 21 THEN 
      '20' 
     WHEN tb_usuario.int_id_cargo = 23 THEN 
      '22' 
     WHEN tb_usuario.int_id_cargo = 24 THEN 
      '20,21,22,23' 
     WHEN tb_usuario.int_id_cargo = 25 THEN 
      '20,21,22,23,24' 
     WHEN tb_usuario.int_id_cargo = 26 THEN 
      '20,21,22,23,24,25' 
     WHEN tb_usuario.int_id_cargo = 28 THEN 
      '27' 
     WHEN tb_usuario.int_id_cargo = 30 THEN 
      '29' 
     WHEN tb_usuario.int_id_cargo = 31 THEN 
      '27,28' 
     WHEN tb_usuario.int_id_cargo = 32 THEN 
      '27,28,31' 
     WHEN tb_usuario.int_id_cargo = 33 THEN 
      '29,30' 
     WHEN tb_usuario.int_id_cargo = 34 THEN 
      '27,28,29,30,31,32,33' 
     ELSE '' 
     END) as subs 

Bien que je ne vois pas l'intérêt de distinguer les valeurs spécifiques qui doivent retourner une chaîne de longueur zéro vs simplement laisser ELSE (qui retourne la même valeur) attraper ces :

(SELECT CASE tb_usuario.int_id_cargo 
     WHEN 13 THEN 
      '20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53' 
     WHEN 21 THEN 
      '20' 
     WHEN 23 THEN 
      '22' 
     WHEN 24 THEN 
      '20,21,22,23' 
     WHEN 25 THEN 
      '20,21,22,23,24' 
     WHEN 26 THEN 
      '20,21,22,23,24,25' 
     WHEN 28 THEN 
      '27' 
     WHEN 30 THEN 
      '29' 
     WHEN 31 THEN 
      '27,28' 
     WHEN 32 THEN 
      '27,28,31' 
     WHEN 33 THEN 
      '29,30' 
     WHEN 34 THEN 
      '27,28,29,30,31,32,33' 
     ELSE '' 
     END) as subs 
Questions connexes