如何使用CASE语句设置局部变量

时间:2018-07-03 14:16:01

标签: sql sql-server sql-server-2008

让我首先说:“我确定有一种更简单的方法可以执行此操作,但我找不到它...”

我试图基于记录中的4个独立值构造一个跟踪号,以便我可以串联变量并将该串联字符串插入另一个表中。

DECLARE @fy char = '';
SET @fy = (SELECT proposalCallID,
                CASE
                    WHEN proposalCallID IN (7, 8) THEN '19'
                    WHEN proposalCallID IN (5, 6) THEN '18'
                END
            FROM proposalPackage WHERE proposalCallID = 15)

我收到一个错误“当EXISTS未引入子查询时,只能在选择列表中指定一个表达式。”

跟踪号由4个部分组成,因此我需要对其中的4个查询进行串联以组成完整的跟踪号。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您要在查询中选择2列(即多个值),但尝试将它们推入单个值变量中。

您的查询选择proposalCallID本身,然后选择CASE语句生成的另一列。因此,结果集将包括两列。 SQL Server不能在一个变量中存储两列。这就是导致您出错的原因。

尝试以下方法:

DECLARE @fy VARCHAR(10) = '';
SELECT @fy = CASE
                    WHEN proposalCallID IN (7, 8) THEN '19'
                    WHEN proposalCallID IN (5, 6) THEN '18'
                    ELSE ''
                END
FROM proposalPackage
WHERE proposalCallID = 15;

答案 1 :(得分:2)

这是您要做什么吗?

DECLARE @fy char(2) = '';

SELECT @fy = (CASE WHEN proposalCallID IN (7, 8) THEN '19'
                   WHEN proposalCallID IN (5, 6) THEN '18'
              END)
FROM proposalPackage
WHERE proposalCallID = 15;

请注意@fy的长度规范,因此该值合适。 始终在SQL Server中将长度指定与字符类型一起使用。

根据逻辑,您可以完全省去设置值。 CASE表达式返回的值为NULL,因此:

DECLARE @fy char(2);

效果完全一样。

答案 2 :(得分:0)

如果我理解正确,您对一个字符串的四个部分中的每个部分都有一个查询吗?

SET @fy = (query1) + (query2) + (query3) + (query 4)