我是SQL Server的新手,这是我的第一篇文章。
使用Case语句时,我收到消息“'='附近的语法不正确。这是我的代码示例:
Select * , CASE
when a > b THEN b = a
when c > d THEN d = c
when e > f THEN f = e
when g > h THEN h = g
when i > j THEN j = i
when k > l THEN l = k
when m > n THEN n = m
when o > p THEN p = o
END as value
INTO #temptable
From #atemptable
在此先感谢您的帮助!
答案 0 :(得分:1)
您需要了解有关T-SQL中CASE
语句的重要说明:
CASE表达式按顺序评估其条件,并从满足条件的第一个条件停止
在此处了解更多信息:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017
因此,根据上述技巧,您CASE
将不会按预期执行,因为如果我们假设您的第一个条件(a> b)为真,那么对CASE
的求值将停止,您将无法获得其他条件的结果。
要解决此问题,您需要为每个条件编写一个CASE
语句,如下所示:
SELECT *,
CASE WHEN a > b THEN b ELSE a END AS AorB,
CASE WHEN c > d THEN d ELSE c END AS CorD,
CASE WHEN e > f THEN f ELSE e END AS EorF,
CASE WHEN g > h THEN h ELSE g END AS GorH,
CASE WHEN i > j THEN j ELSE i END AS JorI,
CASE WHEN k > l THEN l ELSE k END AS LorK,
CASE WHEN m > n THEN n ELSE m END AS MorN,
CASE WHEN o > p THEN p ELSE o END AS OorP
INTO #temptable
From #atemptable
更新
如您在评论中所述:
我正在尝试评估一个表达式,在该表达式中检查一个变量是否大于另一个变量。如果将其设置为较小的变量等于较大的变量
所以故事完全不同,您应该使用这样的方法:
假设我们有一组定义如下的变量:阅读有关T-SQL中的变量定义的更多信息:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-2017
DECLARE
@a INT = 2, @b INT = 1,
@c INT = 3, @d INT = 4,
@e INT = 6, @f INT = 5,
@g INT = 7, @h INT = 8,
@i INT = 10,@j INT = 9,
@k INT = 12,@l INT = 11,
@m INT = 13,@n INT = 14,
@o INT = 16,@p INT = 15
要评估您的方案,我们需要编写以下代码:
SET @b= CASE WHEN @a > @b THEN @a ELSE @b END
SET @d= CASE WHEN @c > @d THEN @c ELSE @d END
SET @f= CASE WHEN @e > @f THEN @e ELSE @f END
SET @h= CASE WHEN @g > @h THEN @g ELSE @g END
SET @j= CASE WHEN @i > @j THEN @i ELSE @i END
SET @l= CASE WHEN @k > @l THEN @k ELSE @k END
SET @n= CASE WHEN @m > @n THEN @m ELSE @m END
SET @p= CASE WHEN @o > @p THEN @o ELSE @o END
因此,如果执行SELECT,我们将看到结果:
SELECT @a,@b, ...
答案 1 :(得分:0)
尚不清楚您是否希望将THEN
部分用作分配或比较。无论哪种方式,THEN
部分都只能是表达式。我假设您想要一项任务。看来您不想更新#atemptable
,而只想要#temptable
中的新值。在这种情况下,您可以使用单独的CASE
表达式,如下所示:
SELECT A, CASE WHEN A > B THEN A ELSE B END AS B,
C, CASE WHEN C > D THEN C ELSE D END AS D
END AS value
INTO #temptable
FROM #atemptable
答案 2 :(得分:0)
不仅您需要TT在注释中写的更新语句,而且还不能将案例表达式用作流控制。
case表达式根据条件返回一个值。 case表达式的Then
部分内部的操作仅在返回值时才有效。
您可能正在寻找这样的东西:
UPDATE #temptable
SET B = CASE A > B Than A ELSE B END
,D = IIF(C > D, C, D) -- IIF is syntactic sugar for simple case expressions
-- more of the same for all other columns