1

这将很难解释,但在这里。

我希望在一个SELECT子句中执行 CASE 条件,该条件将使用两个计算的结果来确定为列值返回哪个计算值。

也许代码示例会有所帮助:

这有效:

SELECT 
   A.[COLUMN1]
   , B.[COLUMN1]
   , CASE 
      WHEN A.[COLUMN2] + A.[COLUMN3] >= B.[COLUMN2] + B.[COLUMN3] THEN A.[COLUMN2] + A.[COLUMN3]
      ELSE B.[COLUMN2] + B.[COLUMN3]
FROM
   [TABLE_A] A
      INNER JOIN [TABLE_B] B INNER JOIN ON A.ID = B.ID

这里的问题是上面的查询,在case语句中,被强制执行了两次计算。一次用于WHEN子句,再次用于THEN子句。

我想做这样的事情,但 SQL 对此并不满意。

SELECT 
   A.[COLUMN1]
   , B.[COLUMN1]
   , CASE 
      WHEN AB.X >= AB.Y THEN AB.X
      ELSE AB.Y
     END
     FROM ((A.[COLUMN2] + A.[COLUMN3]) X, (B.[COLUMN2] + B.[COLUMN3]) Y)
FROM
   [TABLE_A] A
      INNER JOIN [TABLE_B] B INNER JOIN ON A.ID = B.ID

这甚至可能吗?在第二个示例中,我只计算一次值并在 case 语句中引用它们,包括 theWHENTHEN子句。

4

2 回答 2

1

您可以将其重新表述为

SELECT a_column1, 
       b_column1, 
       CASE 
         WHEN x >= y THEN x 
         ELSE y 
       END AS foo 
FROM   (SELECT A.[column1]                   A_COLUMN1, 
               B.[column1]                   B_COLUMN1, 
               ( A.[column2] + A.[column3] ) X, 
               ( B.[column2] + B.[column3] ) Y 
        FROM   [table_a] A 
               INNER JOIN [table_b] B 
                       ON A.id = B.id)t 

但我不确定它是否会有所作为,因为无论如何操作可能每行执行一次

于 2013-02-07T22:39:37.037 回答
1

我更愿意将计算下推到每个表中。这使查询的结构非常相似。因此,语法正确(或几乎正确)的版本将是:

SELECT A.[COLUMN1], B.[COLUMN1],
       (CASE WHEN a.col_2_3 >= b.col_2_3 THEN a.col_2_3
             ELSE b.col_2_3
        end)
FROM (select a.*,  (A.[COLUMN2] + A.[COLUMN3]) as col_2_3
      from [TABLE_A] a
     ) a INNER JOIN
     (select b.*, (B.[COLUMN2] + B.[COLUMN3]) as col_2_3
      from [TABLE_B] b
     )b
     ON a.ID = b.ID

性能有很多重要因素,简单计算的开销不是其中之一。读取数据和连接比简单的计算要昂贵得多。

但是,出于几个原因,将变量移动到子查询中很有用。首先,计算可能更昂贵(例如,使用子查询)。它还有助于提高可读性,从而提高可维护性。

最后,SQL 引擎可以决定只对这些表达式求值一次。在实践中,我猜没有人会进行这种微不足道的优化。

于 2013-02-07T22:46:07.077 回答