CASE SQL语句中的比较符号“大于”和“等于”

时间:2019-06-02 04:13:00

标签: tsql comparison-operators case-statement

我是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

在此先感谢您的帮助!

3 个答案:

答案 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