在CASE表达式中返回多个值

时间:2012-05-31 17:49:38

标签: sql sql-server tsql sql-server-2005

我有一个过时的存储过程,如下所示:

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”)。

4 个答案:

答案 0 :(得分: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

很难给出确定的答案,因为你还没有真正概述所有可能的排列。

答案 1 :(得分: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 

更强烈的解决方案将涉及查找表。因此,您的case语句将生成一个唯一键。然后,此密钥将连接到查找表,您可以拥有任意数量的值。但是,这适用于常量,但不适用于公式。

答案 2 :(得分: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

答案 3 :(得分:-1)

您可以启动AND'条件并返回相应的值......

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