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”和“非成员”,或者这些是相互排斥的?