Saklı bir yordam kullanarak bir dizenin SQL Server 2005'te bir alt dize içerip içermediğini denetleyin


245

Bir ipim var @mainString = 'CATCH ME IF YOU CAN'. Kelimenin MEiçeride olup olmadığını kontrol etmek istiyorum @mainString.

Bir dizenin SQL'de belirli bir alt dizeye sahip olup olmadığını nasıl kontrol edebilirim?

Yanıtlar:


395

CHARINDEX (), daha büyük bir dizede bir alt dizeyi arar ve eşleşmenin konumunu döndürür veya eşleşme bulunmazsa 0 değerini döndürür

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

Düzenleme veya bir kelimeyi (ve sözcüklerin değil alt bileşenlerini) bulmak isteyen konum daniels cevabını, senin CHARINDEX çağrı gibi görünecektir:

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

(Olası olabilecek diğer noktalama işaretlerini daha fazla yinelemeli REPLACE () çağrısı ekleyin


2
Okie PATINDEX kullandım. Teşekkür ederim!
NLV

1
s / özyinelemeli / iç içe / - "özyinelemeli" REPLACEkendisi çağrılırsa; "iç içe", bir işlev çağrısının sonucunun hemen başka bir işleve geçirildiği zamandır.
Monica'nın Davası

2
'ME' SQL'de büyük / küçük harfe duyarlı mı yoksa 'Ben' ve 'ben' için bir if ifadesi de yapmak zorunda mıydınız?
a.powell

5
@ a.powell - harmanlama işleminin içerdiği duruma bağlıdır. Öyle ya da böyle bir şeye ihtiyacınız varsa bunu her zaman bu testte zorlayabilirsiniz. Örneğin karşılaştırın select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')ve select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (Harmanlamalarda CSBüyük / Küçük Harfe Duyarlı anlamına gelir ve emin olabilirsiniz CI).
Damien_The_Unbeliever

2
@VincePanuccio - T-SQL'in string işleme özelliği oldukça zayıf. SQL'in gücü küme tabanlı işlemlerde. Bu durumda (dize işleme yapmak ve regex'in bariz bir çözüm olacağı bir şey), daha çok iş için yanlış aracı seçmelerinden kaynaklanır.
Damien_The_Unbeliever

120

Konumda joker karakterler kullanabilirsiniz (IF, WHERE veya ON'dan sonra):

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

veya bu özel durumda

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

(Tüm kelimeyi arıyorsanız, alıntılanan dizeye boşluk koyun veya ME daha büyük bir kelimenin parçası olabilirse boşlukları bırakın).


3
Kelime eşleşmeleri (ikinci örneğiniz) arıyorsanız, a) @mainString'ten önce ve sonra bir boşluk eklemeniz gerekir (böylece ilk veya son kelimeyle eşleşebilirsiniz) ve b) noktalama işaretlerini kaldırın
Damien_The_Unbeliever

2
Bu benim için CHARINDEX () 'den daha iyidir çünkü özel durumumda, sınırlı izinler nedeniyle CHARINDEX () işlevini çalıştıramıyorum.
James T Snell

1
(Sadece ile tüm dize sabitleri önek unutmayın Nsütun bir ise nvarcharaksi takdirde başına sıranın dönüşüm elde,)
Richard SZALAY
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.