4

結合されたテーブルから複数の列を選択する SELECT 句を持つストアドプロシージャを作成しています。これらの列の 1 つの値は、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 ...

select でわかるように、FLOOR(table3.col3/0.2)*0.2 の計算を 3 回行っています。この計算値を変数 WITHIN THE 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

補足として、私が言及している最小関数は構築する必要があります(ユーザー定義関数)。

于 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 に答える