Saya akan sangat terkejut jika Anda dapat mendeteksi perbedaan antara WHERE col LIKE '[0-9]'
dan metode lain yang Anda temukan. Tapi saya setuju dengan Denis, simpan itu dalam suatu fungsi sehingga Anda menggunakan pemeriksaan yang sama secara konsisten di seluruh kode Anda (atau setidaknya, jika Anda menghindari UDF karena pemindaian besar dll., letakkan penanda di kode Anda yang akan membuatnya mudah untuk diubah dalam skala luas nanti).
Yang mengatakan, Anda pasti akan melihat lebih banyak kinerja yang dicapai hanya dengan menggunakan UDF skalar daripada metode apa yang Anda gunakan untuk mengurai di dalam fungsi. Anda benar-benar harus membandingkan kinerja UDF vs. melakukan itu sebaris menggunakan CASE
. misalnya
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Ini akan menghasilkan NULL
jika karakternya bukan numerik.
Jika Anda hanya berurusan dengan memeriksa variabel lokal, sebenarnya tidak masalah metode penguraian apa yang Anda gunakan, dan Anda lebih baik memfokuskan upaya pengoptimalan Anda di tempat lain.
EDIT menambahkan saran untuk mendemonstrasikan JOIN
ayat. Ini berpotensi menyebabkan pemindaian yang kurang konstan tetapi jauh lebih mudah dibaca (panggilan substring jauh lebih sedikit, dll):
;WITH v AS
(
SELECT /* other columns, */ patientPostal,
ss = SUBSTRING(v.patientPostal,2,1),
FROM [whatever table is aliased v in current query]
)
SELECT /* column list */
FROM [whatever table is aliased z in current query]
INNER JOIN v ON z.postal = CONVERT(INT, CASE
WHEN v.ss = '0' THEN ss
WHEN v.ss LIKE '[1-9]' THEN LEFT(v.patientPostal, 3)
END);