数据检索 SELECT - SQL 中的 LocalVariable



我正在制作一个存储过程,它有一个 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 中的变量中,然后在条件中使用此变量?

提前感谢,

杰罗恩

不,您可以将其减少到 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

带最小值功能:

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

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

一种方法可以通过在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

你可以做一个子查询

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

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

最新更新