如何对子查询中的值执行CASE

时间:2013-02-07 22:32:21

标签: sql case

这很难解释,但这里有。

我希望在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语句中引用它们,包括WHENTHEN子句。

2 个答案:

答案 0 :(得分: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 

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

答案 1 :(得分: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引擎可以决定只评估这些表达式一次。在实践中,我猜测没有人会进行那种微不足道的优化。