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

Sql 如何使用CASE语句设置局部变量,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,让我先说“我确信有更简单的方法,但我找不到…” 我试图基于一个记录中的4个独立值构造一个跟踪号,这样我就可以连接变量并将连接的字符串插入到另一个表中 DECLARE @fy char = ''; SET @fy = (SELECT proposalCallID, CASE WHEN proposalCallID IN (7, 8) THEN '19' WHEN proposalCall

让我先说“我确信有更简单的方法,但我找不到…”

我试图基于一个记录中的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时,只能在select列表中指定一个表达式。”

跟踪编号有4个部分,因此我有4个查询需要连接这些部分以生成完整的跟踪编号


非常感谢您的帮助。

您在查询中选择了两列(即多个值),但试图将它们放入一个值变量中

您的查询选择
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;

这就是你想做的吗

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

具有完全相同的效果。

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

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

您将在子查询中返回两个值,
proposalCallID
,以及来自
大小写
表达式的值。它应该是哪个?删除不需要的值。您在语句中选择了2个值。是否尝试过将SELECT向下剪切以仅返回一行和一列?(你告诉它将@fy设置为哪个列)?因此,它不再崩溃,但不会返回预期的“19”。。。事实上,我知道proposalCallID=8的值,所以它应该在@fy中插入19,对吗?@RLoomas因为您的查询指定了
proposalCallID=15
CASE
语句将始终失败并返回null。@RLoomas是的,您的WHERE子句将过滤掉您的预期结果。去掉WHERE子句,你会看到不同的结果。WHERE子句中的过滤器应该是“proposalPackageID”DOH!!!