Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Alias ​​referensi (dihitung dalam SELECT) dalam klausa WHERE

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghitung jumlah bulan penuh antara dua tanggal dalam SQL

  2. Mendapatkan nilai pengembalian dari prosedur tersimpan di C #

  3. Cara Mengkonfigurasi Database Mail di SQL Server

  4. TODATETIMEOFFSET() Contoh di SQL Server

  5. Bagaimana saya bisa mendapatkan nama kolom dari tabel di SQL Server?