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

SQL tambahkan filter hanya jika variabel bukan nol

Anda dapat menerjemahkan kebutuhan Anda menjadi :

SELECT  route_id [ROUTE_ID]
FROM route_master(NOLOCK)
WHERE  route_ou = 2
AND   (@l_s_query is null OR route_query = @l_s_query)
AND   lang_id  = 1
OPTION (RECOMPILE)

OPTION (RECOMPILE) adalah opsional tetapi dapat memberikan rencana eksekusi yang lebih baik dengan mengorbankan waktu kompilasi tambahan seperti yang dibahas dalam artikel kanonik tentang topik Kondisi Penelusuran Dinamis di T‑SQL

Atau dengan COALESCE() untuk menghindari OR :

WHERE  route_ou = 2
AND   COALESCE(@l_s_query,route_query) = route_query 
AND   lang_id  = 1

Catatan: Seperti yang dikatakan @jarlh, jika route_query tidak dapat dibatalkan, ini dapat menyebabkan beberapa masalah karena perbandingan nol, jadi Anda mungkin ingin menggunakan kueri pertama.

Opsi lain dari ini adalah dua kueri terpisah menggunakan UNION ALL , satu untuk setiap kondisi -

SELECT .. FROM .. 
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM .. 
WHERE @l_s_query = route_query

Dalam hal kinerja, hanya yang terakhir yang akan menggunakan indeks, saya yakin yang pertama akan menjadi yang tercepat, tetapi mungkin berubah tergantung pada indeks, ukuran tabel DLL..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan tipe data tanggal sql dan EF4

  2. Jenis teks, nteks, dan data gambar> tidak dapat dibandingkan atau diurutkan, kecuali jika menggunakan operator IS NULL atau LIKE>

  3. Skema informasi dan Kunci Utama

  4. Impor Tanggal String di kolom Derived

  5. Perbedaan Antara sys.columns, sys.system_columns, &sys.all_columns di SQL Server