我正在创建一个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
答案 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
但是,查询优化器可能会自动缓存计算结果。