2010-10-31 106 views
0

我在SQL查詢中有一個大的選擇案例。語法SQL Server案例

(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 

如果你留意,你會發現有一些返回一個空string.I想檢查那些在一個單一的情況下返回空字符串,即很多情況下:

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

是這樣可能?

回答

3

如何使用表格(臨時表格)在不使用CASE語句的情況下選擇此值?

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

和您的查詢就會像

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

編輯:對於多個old_id指向同一個空字符串NEW_ID,你將不得不單獨創建

的條目如(假設old_id 1 & 2點至NEW_ID - >空白)

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

這將具有其他使用該表比改變上述寫入的查詢從空白改變NEW_ID的東西的優點。

+0

這是一個更優雅的解決方案,可能是user257234應該考慮的。如果這些價值觀可能發生變化,他/她所寫的將是PIA來管理。 – Vinnie 2010-10-31 18:51:34

+0

這是如何處理零長度字符串選項的? – 2010-10-31 19:02:29

+0

@OMG小馬:請參閱編輯問題的答案。 – shahkalpesh 2010-10-31 19:35:55

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 

代替....與IDS 的其餘部分,然後固定第二case語句,這樣所有其他值

2

我只想把它留給了ELSE條款相匹配。只列出您想要在CASE聲明中匹配的ID。除非您有理由在案例陳述中保留這些ID。

(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

用途:

(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 

雖然我沒有看到區分特定值的點應該返回一個零長度字符串VS只是讓ELSE(返回相同的值)捕捉這些:

(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