Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在大小写表达式中返回多个值_Sql_Sql Server_Tsql_Sql Server 2005 - Fatal编程技术网

Sql 在大小写表达式中返回多个值

Sql 在大小写表达式中返回多个值,sql,sql-server,tsql,sql-server-2005,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_membe

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

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
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 

它当前编写的方式是,一旦它遇到第一个
WHEN
子句,我的
org\u status
值将是“pac”。有人能告诉我如何重新编写此文件,以便
org\u status
可以包含返回的多个值(即:“pac | partner\u member”)。

您可以开始并输入条件并返回相应的值

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

哦,那太好了。SQL不支持案例的多次返回

如果您不反对字符串操作,可以执行以下操作:

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
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语句将生成一个唯一的键。然后,该键将被连接到一个查找表,您可以拥有任意多的值。但是,这适用于常量,但不适用于公式。

仅使用两个
大小写表达式如何

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

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

我认为与其将这些值组合在一起,然后再将它们重新分解出来,不如始终将它们分开

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

这个怎么了?它只是在做正确的事情。。。案例将针对每一行进行评估,显然,任何一行最多只能有一种类型。@Rahul。。。OP希望根据不同的条件和条件连接值。@swasheck,不确定;我有点困惑。。。我想他是在要求不要检查所有的条件或类似的东西。CASE是一个返回单个值的表达式。这不是一个开关语句,也不是用来控制流量的。@AaronBertrand,我知道。这就是为什么我要求提供其他解决方案,根据新的请求更新这个过时的查询。这会有什么不同?我只是说。。。;这是整合status变量中的值的一种方法,尽管它可能会导致查询中出现笨拙的CASE子句,因为它需要考虑所有可能的(当然是相关的)组合。因此,在我的例子中,如果一个用户可以是所有三个返回值(pac、partner_成员和associate_成员),我必须将所有
case
表达式连接在一起?它们不可能同时是partner_成员和associate_成员-它们必须是一个或另一个,因为它们在单个列中需要不同的值(会费类别)。你能展示一些样本数据和所有可能组合的预期结果吗?基于模糊词问题对你的模式进行反向工程不是我心目中的一方。:-)此外,是否可能是“pac”和“非成员”,或者这些是相互排斥的?