你需要知道关于 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, ...