我有一个SQL Select语句,我需要根据条件返回某些值。我每次都需要返回多个值,但是我对Case语句的理解是你只能为每个case返回一个值。
我现在通过使用UNION语句来解决这个问题,但这看起来有点麻烦 - 有更好的方法吗?基本上,我有一堆提示,每个提示都有“是”,“否”或“未来”的响应(我实际上有更多的回复,但我只会使用3作为示例来保持简短!) - 我需要为每个响应类型生成一个列,其中1表示相应响应的值,0表示所有其他响应类型。如果你看一下SQL,可能会更清楚......
我的(简化)查询如下所示:
SELECT branch,
promptType,
response,
1 AS 'Yes',
0 AS 'No',
0 AS 'Not Discussed'
FROM prompts
WHERE response = 'Y'
UNION
SELECT branch,
promptType,
response,
0 AS 'Yes',
1 AS 'No',
0 AS 'Not Discussed'
FROM prompts
WHERE response = 'N'
UNION
SELECT branch,
promptType,
response,
0 AS 'Yes',
0 AS 'No',
1 AS 'Not Discussed'
FROM prompts
WHERE response = 'D'
答案 0 :(得分:4)
像...一样的东西。
SELECT branch,
prompttype,
CASE WHEN response = 'Y' THEN 'Yes'
WHEN response = 'N' THEN 'No'
WHEN response = 'D' THEN 'Not Discussed'
FROM prompts;
可能就是你想要的。
在您的评论之后,或许......
SELECT branch,
prompttype,
CASE WHEN response = 'Y' THEN 1 ELSE 0 AS Yes,
CASE WHEN response = 'N' THEN 1 ELSE 0 AS No,
CASE WHEN response = 'D' THEN 1 ELSE 0 AS Not_Discussed
FROM prompts;
可能会这样做。
答案 1 :(得分:3)
您是否考虑过为响应创建解码表并加入到该?
例如,这将创建一个用于解码响应的表:
CREATE TABLE decoder (response CHAR(1), [Yes] BIT, [No] BIT, [Not Discussed] BIT)
INSERT INTO decoder VALUES ('Y', 1, 0, 0)
INSERT INTO decoder VALUES ('N', 0, 1, 0)
INSERT INTO decoder VALUES ('D', 0, 0, 1)
...然后您可以加入它以获得与您的UNION相似的(相同的?)结果:
SELECT
prompts.branch,
prompts.prompttype,
prompts.response,
decoder.yes,
decoder.no,
decoder.[Not Discussed]
FROM
prompts INNER JOIN decoder ON prompts.response = decoder.response
可能是值得考虑的方法;它是一个比你的联盟更具关系性的解决方案,而且可能更容易维护。
答案 2 :(得分:1)
我认为你需要添加分组。我用季度预测做了这个。如果你有一个唯一的ID用于每个响应,它将是这样的(否则它将选择整个分支/提示类型/响应的最大值):
SELECT uniqueID,
branch,
prompttype,
response,
MAX(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) AS Yes,
MAX(CASE WHEN response = 'N' THEN 1 ELSE 0 END) AS [No],
MAX(CASE WHEN response = 'D' THEN 1 ELSE 0 END) AS Not_Discussed
FROM prompts
GROUP BY uniqueID,
branch,
prompttype,
response;
答案 3 :(得分:0)
SELECT branch,
prompttype,
response,
CASE WHEN response = 'Y' THEN 1 ELSE 0 END AS Yes,
CASE WHEN response = 'N' THEN 1 ELSE 0 END AS [No],
CASE WHEN response = 'D' THEN 1 ELSE 0 END AS Not_Discussed
FROM prompts;
答案 4 :(得分:0)
如果您提出的CASE
语句在单个列中返回多个值,那么数据类型是什么:数组,列表,表,XML文档,业务对象等?对于真正的关系数据库管理系统(TRDBMS),答案是关系变量。但我们在这里谈论SQL Server。
我认为你要找的答案是SQL Server的数据类型是标量的,而不是多值的。