数据检索中的局部变量SELECT - SQL

时间:2012-09-19 08:49:51

标签: sql select local-variables

我正在创建一个storedprocedure,它有一个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计算。是否可以将此计算值存储在WITHIN SELECT中的变量中,然后在条件中使用此变量?

提前致谢,

的Jeroen

3 个答案:

答案 0 :(得分: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函数(用户定义的函数)。

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

答案 2 :(得分:0)

你可以做一个子查询

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

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