SELECTは評価される最後の2番目の句であるため、ORDER BY以外ではエイリアスを参照できません。2つの回避策:
SELECT BalanceDue FROM (
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
) AS x
WHERE BalanceDue > 0;
または単に式を繰り返します:
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;
私は後者を好みます。式が非常に複雑である(または計算にコストがかかる)場合は、代わりに計算列(およびおそらく永続化)を検討する必要があります(特に、多くのクエリがこの同じ式を参照している場合)。
PSあなたの恐れは根拠がないようです。少なくともこの簡単な例では、SQL Serverは2回参照したとしても、計算を1回だけ実行するのに十分なほどスマートです。先に進んで計画を比較してください。それらは同一であることがわかります。式が複数回評価されるというより複雑なケースがある場合は、より複雑なクエリとプランを投稿してください。
以下は、まったく同じ実行プランを生成する5つのクエリ例です。
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
WHERE LEN(name) + column_id > 30;
SELECT x FROM (
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE x > 30;
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
WHERE column_id + LEN(name) > 30;
SELECT name, column_id, x FROM (
SELECT name, column_id, LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE x > 30;
SELECT name, column_id, x FROM (
SELECT name, column_id, LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE LEN(name) + column_id > 30;
5つのクエリすべての結果の計画: