Anda tidak dapat mereferensikan alias kecuali dalam ORDER BY karena SELECT adalah klausa terakhir kedua yang dievaluasi. Dua solusi:
SELECT BalanceDue FROM (
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
) AS x
WHERE BalanceDue > 0;
Atau cukup ulangi ekspresi:
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;
Saya lebih suka yang terakhir. Jika ekspresi sangat kompleks (atau mahal untuk dihitung), Anda mungkin harus mempertimbangkan kolom yang dihitung (dan mungkin tetap ada), terutama jika banyak kueri merujuk ke ekspresi yang sama ini.
PS ketakutan Anda tampaknya tidak berdasar. Dalam contoh sederhana ini setidaknya, SQL Server cukup pintar untuk hanya melakukan perhitungan satu kali, meskipun Anda telah mereferensikannya dua kali. Silakan dan bandingkan rencananya; Anda akan melihat mereka identik. Jika Anda memiliki kasus yang lebih kompleks di mana Anda melihat ekspresi dievaluasi beberapa kali, harap posting kueri dan rencana yang lebih kompleks.
Berikut adalah 5 contoh kueri yang semuanya menghasilkan rencana eksekusi yang sama persis:
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;
Rencana yang dihasilkan untuk kelima kueri: