web-dev-qa-db-ja.com

列の値を別の列(SQL Server)に使用しますか?

特定のテーブルに膨大な数の選択肢があるとしましょう。列の1つの値は、複素数logcを使用して計算され、ColumnAと呼ばれます。ここで、別の列について、ColumnAの値が必要であり、それに他の静的な値を追加します。

サンプルSQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...

[ColumnA] + 1は私が探しているものです。複雑なものは巨大なケース/ブロック時です。

アイデア?

17
grady

SELECT句で計算された値を参照する場合は、既存のクエリをサブSELECTに移動する必要があります。

SELECT
    /* Other columns */,
    ColumnA,
    ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t

使用しない場合でも、このテーブルのエイリアスを導入する必要があります(上記のt、閉じ括弧の後に)。

(同等に-SQL Server 2005以降を使用していると仮定すると-既存のクエリをCTEに移動できます):

;WITH PartialResults as (
     select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults

複数レベルの部分計算が実行されている場合、CTEはよりクリーンに見える傾向があります。クエリに含めるColumnBに依存する計算がある場合。

20

残念ながら、SQL Server2016では次のようになります。

SELECT 3 AS a, 6/a AS b;

エラー:無効な列名: 'a'。

2
Ludovic Aubert

これはサブクエリと列エイリアスで解決できます。

次に例を示します。

SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
      FROM SomeTable t) As SomeTableMaxId
1

あなたは出来る:

  1. クライアントコードで+ 10を実行します
  2. complex stuffのロジックをカプセル化するスカラー値関数を記述します。単一の呼び出しに最適化されます。
  3. 他の列のcomplex stuffロジックをコピーします。 1回の呼び出しに最適化する必要があります。
  4. 副選択を使用して、追加の計算を適用します
1
tenfour