web-dev-qa-db-ja.com

SQLServerは計算列を参照します

計算列を含むselectステートメントがあり、ある計算列の値を別の列で使用したいと思います。これは可能ですか?これは私がやろうとしていることを示すために考案された例です。

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
26
MHinton

番号。

選択からの単一行のすべての結果はアトミックです。つまり、それらすべてを並行して発生し、相互に依存できないかのように表示できます。

計算列を参照している場合は、選択中に結果を変更するために数式の入力を更新する必要があります。

計算列は、呼び出すたびに少しの計算を挿入するマクロまたはミニビューと考えてください。

たとえば、これらの列は常に同一になります。

-- assume that 'Calc' is a computed column equal to Salaray*.25
SELECT Calc, Salary*.25 Calc2 FROM YourTable

また、persistedオプションはこれを変更しないことにも注意してください。インデックス作成に適した値を保持しますが、アトミック性は変わりません。

21
Michael Haren

残念ながら実際にはそうではありませんが、時にはそれだけの価値がある回避策

SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
11
erikkallen

はい、それは可能です。

ネストされた選択には WITHステートメント を使用します。

4
Benni

それを行うために私が考えることができる2つの方法。最初に、ステートメントが実行されるまでSQL Serverに関する限り、calval1列は存在しないことを理解してください。したがって、例を示すように直接使用することはできません。したがって、計算を2回そこに入れることができます。1回はcalval1の場合、もう1回はcalval2計算のcalcval1の代わりとして使用します。もう1つの方法は、calval1を含む派生テーブルを作成し、派生テーブルの外部で次のようにcalval2を計算することです。

select calcval1*.25 as calval2, calval1, field1, field2
from (select casestament as cavlval1, field1, field2 from my table) a

両方のパフォーマンスをテストする必要があります。

3
HLGEM

副選択の代わりに外部適用を使用する必要があります。

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
2
Frederic

Select句で計算列の値を「リセット」することはできません。それを実行しようとしている場合は、...計算列の値は計算列の数式に基づいています。これには別の計算列の値を含めることができますが、Select句の数式をリセットすることはできません... 2つの計算列に基づいて値を「出力」するだけの場合は、(の構文として)質問は「それから「[calcval2]」を読みます

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 

select句の出力で列エイリアスになります。

または、ある計算列の数式を別の列に基づいて定義する方法を尋ねていますか?

0
Charles Bretana