Periksa apakah string berisi substring di SQL Server 2005, menggunakan prosedur tersimpan

245

Saya punya string @mainString = 'CATCH ME IF YOU CAN',. Saya ingin memeriksa apakah kata itu MEada di dalam @mainString.

Bagaimana cara memeriksa apakah string memiliki substring tertentu dalam SQL?

NLV
sumber

Jawaban:

395

CHARINDEX () mencari substring dalam string yang lebih besar, dan mengembalikan posisi kecocokan, atau 0 jika tidak ada kecocokan yang ditemukan

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end

Edit atau dari daniels jawab, jika Anda ingin menemukan kata (dan bukan subkomponen kata), panggilan CHARINDEX Anda akan terlihat seperti:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')

(Tambahkan REPLACE rekursif lebih banyak () panggilan untuk tanda baca lain yang mungkin terjadi

Damien_The_Unbeliever
sumber
2
Okie saya menggunakan PATINDEX. Terima kasih!
NLV
1
s / rekursif / bersarang / - "rekursif" akan jika REPLACEdipanggil sendiri; "nested" adalah ketika hasil dari panggilan fungsi segera dialihkan ke fungsi lain.
Dana Gugatan Monica
2
Apakah 'ME' peka huruf besar-kecil di SQL atau Anda juga harus melakukan pernyataan if untuk 'Me' dan 'me'?
a.powell
5
@ a.powell - tergantung pada pemeriksaan yang terlibat. Anda selalu dapat memaksanya dalam tes ini jika Anda membutuhkannya dengan satu atau lain cara. Misalnya membandingkan select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')dan select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (Dalam susunan, CSsingkatan dari Case Sensitive dan saya yakin Anda dapat berolahraga CI).
Damien_The_Unbeliever
2
@VincePanuccio - Pemrosesan string T-SQL sangat lemah. Kekuatan SQL dalam operasi berbasis set. Dalam hal ini (ingin melakukan pemrosesan string, dan sesuatu di mana regex akan menjadi solusi yang jelas), itu lebih merupakan kasus mereka memilih alat yang salah untuk pekerjaan itu.
Damien_The_Unbeliever
120

Anda bisa menggunakan wildcard dalam predikat (setelah IF, WHERE atau ON):

@mainstring LIKE '%' + @substring + '%'

atau dalam kasus khusus ini

' ' + @mainstring + ' ' LIKE '% ME[., ]%'

(Letakkan spasi di string yang dikutip jika Anda mencari seluruh kata, atau tinggalkan jika ME dapat menjadi bagian dari kata yang lebih besar).

Daniel Quinlan
sumber
3
Jika Anda mencari kata yang cocok (contoh kedua), Anda harus a) menambahkan spasi sebelum dan sesudah @ mainString (sehingga Anda dapat mencocokkan kata pertama atau terakhir), dan b) menghapus tanda baca
Damien_The_Unbeliever
2
Ini lebih baik daripada CHARINDEX () bagi saya karena dalam kasus khusus saya, saya tidak dapat menjalankan fungsi CHARINDEX () karena izin terbatas.
James T Snell
1
(Jangan lupa awali semua konstanta string Anda dengan Njika kolom Anda adalah nvarchar, jika tidak, Anda mendapatkan konversi per baris)
Richard Szalay