2012-05-31 114 views
1

我有一個過時的存儲過程,看起來像:在CASE表達式返回多個值

CASE 
     WHEN (org.org_misc_data = 'PAC') THEN 'pac' 
     WHEN (org.dues_category = 'PART') THEN 'partner_member' 
     WHEN (org.dues_category = 'FREE' AND org.org_status_flag = 'P') THEN 'associate_member' 
     ELSE 'non_member' 
END AS org_status 

它目前寫入的方式,它,一旦它遇到第一個WHEN條款,我org_status值會「PAC」。有人可以指導我如何重寫這個,這樣org_status可以包含返回多個值(即:「pac | partner_member」)。

+0

這是怎麼回事?它只做正確的... CASE將針對每一行進行評估,並且任何行最多隻能有一種類型。 – Rahul

+1

@Rahul ... OP希望根據不同的條件和標準連接值。 – swasheck

+0

@swasheck,不確定;這對我來說有點困惑......我想他是在問所有的條件沒有被檢查或類似的東西。 – Rahul

回答

2

如何使用兩個CASE表達式?

CASE 
    WHEN (org.org_misc_data = 'PAC') THEN 'pac|' ELSE '' END 
    + CASE 
    WHEN (org.dues_category = 'PART') THEN 'partner_member' 
    WHEN (org.dues_category = 'FREE' AND org.org_status_flag = 'P') THEN 'associate_member' 
    ELSE 'non_member' 
END AS org_status 

很難給出明確的答案,因爲您沒有真正列出所有可能的排列。

+0

我沒想過連接'CASE'表達式。因此,就我而言,如果用戶可以是返回值(pac,partner_member和associate_member)的全部三個,那麼我必須將所有'CASE'表達式連接在一起? – etm124

+0

它們不可能既是partner_member也是associate_member - 它們必須是一個或另一個,因爲它們需要單列中的不同值(dues_category)。您能否展示一些示例數據和所有可能組合的理想結果?根據模糊的單詞問題對您的模式進行逆向工程不是我的派對想法。 :-) –

+0

另外,是否有可能成爲「pac」和「非成員」還是這些互斥? – GilM

-1

可以啓動AND'ing的條件,並返回各自的值...

CASE 
    WHEN (org.org_misc_data = 'PAC' AND org.dues_category = 'PART') THEN 'pac|partner_member' 
    .... 
END AS org_status 
+0

這將如何改變? – Rahul

+0

我只是說...;這是整合狀態變量中的值的一種方法,儘管它可能會導致查詢中不易使用的CASE子句,因爲它需要考慮每種可能的(當然是相關的)組合。 –

1

哦,那多好啊。 SQL不支持來自大小寫的多個返回。

如果您不是不利的字符串操作,你可以這樣做:

select *, 
     left(org_status_letter, charindex('|', org_status_letter) - 1) as org_status, 
     substring(org_status_letter, charindex('|', org_status_letter) + 1, 1000) as letter 
from (select (CASE WHEN (org.org_misc_data = 'PAC') THEN 'pac|a' 
        WHEN (org.dues_category = 'PART') THEN 'partner_member|b' 
        ... 
        ELSE 'non_member' 
       END) AS org_status_letter 

更激烈的解決方法將涉及的查找表。所以,你的病例陳述會產生一個獨特的關鍵。然後這個鍵將被加入到查找表中,並且您可以擁有儘可能多的值。但是,這適用於常量,但不適用於公式。

0

我認爲不是將這些值合併,然後再將它們分開,最好始終將它們分開。

CASE 
     WHEN (org.org_misc_data = 'PAC') THEN 1 ELSE 0 END AS IsPack, 
CASE  
     WHEN (org.dues_category = 'PART') THEN 'partner' 
     WHEN (org.dues_category = 'FREE' 
        AND org.org_status_flag = 'P') THEN 'associate' 
     ELSE 'non' END AS MemberStatus 
END AS org_status