SQL Serverは計算列を参照します
-
03-07-2019 - |
質問
計算列を含むselectステートメントがあり、ある計算列の値を別の計算列で使用したいと思います。これは可能ですか?これは、私がやろうとしていることを示すための不自然な例です。
SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
解決
いいえ。
選択からの単一行の結果はすべてアトミックです。つまり、それらはすべて並行して発生し、互いに依存できないかのように表示できます。
計算列を参照している場合は、選択中に結果が変わるように数式の入力を更新する必要があります。
計算列をマクロまたはミニビューと考えて、呼び出すたびに少し計算を挿入します。
たとえば、これらの列は常に同じになります。
-- assume that 'Calc' is a computed column equal to Salaray*.25
SELECT Calc, Salary*.25 Calc2 FROM YourTable
persisted
オプションはこれを変更しないことに注意してください。インデックス作成に適した値を保持しますが、原子性は変わりません。
他のヒント
残念ながら、実際にはそうではありませんが、回避する価値がある場合があります
SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
はい、可能です。
ネストされた選択には、 WITHステートメントを使用します。
これを行うには、2つの方法が考えられます。最初に、文が実行されるまでcalval1列はSQL Serverに関する限り存在しないため、例を示すように直接使用できないことを理解してください。したがって、calval1の計算とcalval2計算でのcalcval1の置換として1回ずつ、計算を2回行うことができます。 もう1つの方法は、calval1を含む派生テーブルを作成し、派生テーブルの外側でcalval2を次のように計算することです。
select calcval1*.25 as calval2, calval1, field1, field2
from (select casestament as cavlval1, field1, field2 from my table) a
両方のパフォーマンスをテストする必要があります。
サブセレクトの代わりに外部適用を使用する必要があります:
select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
「リセット」することはできません。 Select句の計算列の値(これが目的の場合)...計算列の値は、計算列の式に基づいています。他の計算列の値を含めることができる... 2つの計算列に基づく値(質問の構文は次のようになります」"
" [calcval2]"
SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
Select句の出力で列エイリアスになります。
または、ある計算列の計算式を別の計算列に基づいて定義する方法を尋ねていますか?