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..