4

我正在制作一个存储过程,它有一个 SELECT 子句从一些连接表中选择多个列。对于这些列之一,该值取决于 CASE 的条件。

SELECT DISTINCT
 table1.col1 as var1,
 table2.col2 as var2,
 CASE WHEN (FLOOR(table3.col3/0.2)*0.2) > 20 THEN 20
      WHEN (FLOOR(table3.col3/0.2)*0.2) <= 20 THEN FLOOR(table3.col3/0.2)*0.2
      ELSE table3.col4 -- selecting another value is the 
                       -- value in table3.col3 is null
      END as var3 
FROM ... 
WHERE ...

正如您在选择中看到的那样,我正在执行三倍的 FLOOR(table3.col3/0.2)*0.2 计算。是否可以将此计算值存储在 SELECT 内的变量中,然后在条件中使用此变量?

提前致谢,

杰伦

4

3 回答 3

1

不,您可以将其减少到 2 个调用,如下所示。但是无论你做什么,都会比实际这样做更昂贵,因为你在那里做的事情非常快。当您实际上有一些繁重的操作时,您可以考虑改进。这没什么。您也可以创建一个 get_min 函数,但我再次认为这不值得。

有2个电话:

case when table3.col3 then table3.col4
     when (FLOOR(table3.col3/0.2)*0.2) > 20 THEN 20
     else FLOOR(table3.col3/0.2)*0.2
end

带 min 功能:

case when table3.col3 then table3.col4
     else dbo.get_min(FLOOR(table3.col3/0.2)*0.2,20)
end

作为旁注,我所指的 min 函数必须被构建(用户定义的函数)。

于 2012-09-19T09:01:05.437 回答
0

有一种方法可以通过在 的表引用中选择它来执行此操作table3,而不是... FROM table3您可以这样做:

SELECT ...
CASE WHEN (t3.flooredCol3) > 20 THEN 20
  WHEN (t3.flooredCol3) <= 20 THEN t3.flooredCol3

....
FROM 
(
    SELECT col1, ...,
        FLOOR(table3.col3 / 0.2) * 0.2 AS flooredCol3
    FROM table3
) t3
-- the rest of the table references
于 2012-09-19T08:54:33.477 回答
0

你可以做一个子查询

  SELECT
      *, FloorCalc
   FROM
   ( select *, (FLOOR(table3.col3/0.2)*0.2)) as FloorCalc from table3 ...) v

但是,查询优化器可能会自动缓存计算结果。

于 2012-09-19T08:54:51.867 回答