1

我有一个过时的存储过程,看起来像:

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

4 回答 4

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

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

于 2012-05-31T18:19:34.820 回答
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 语句将产生一个唯一的键。然后,该键将连接到查找表,您可以拥有任意数量的值。但是,这适用于常量,但不适用于公式。

于 2012-05-31T17:57:49.567 回答
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
于 2012-05-31T19:15:10.883 回答
-1

您可以开始 AND'ing 条件并返回相应的值...

CASE
    WHEN (org.org_misc_data = 'PAC' AND org.dues_category = 'PART') THEN 'pac|partner_member'
    ....
END AS org_status
于 2012-05-31T17:53:23.940 回答