Sql 如何使用CASE语句设置局部变量
让我先说“我确信有更简单的方法,但我找不到…” 我试图基于一个记录中的4个独立值构造一个跟踪号,这样我就可以连接变量并将连接的字符串插入到另一个表中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
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!!!