Verifique se uma seqüência de caracteres contém uma substring no SQL Server 2005, usando um procedimento armazenado

245

Eu tenho uma corda @mainString = 'CATCH ME IF YOU CAN'. Quero verificar se a palavra MEestá dentro @mainString.

Como verifico se uma string possui uma substring específica no SQL?

NLV
fonte

Respostas:

395

CHARINDEX () procura uma substring dentro de uma string maior e retorna a posição da correspondência ou 0 se nenhuma correspondência for encontrada

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

Edite ou a partir da resposta de daniels, se você deseja encontrar uma palavra (e não subcomponentes), sua chamada CHARINDEX se parecerá com:

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

(Adicione mais chamadas REPLACE () recursivas para qualquer outra pontuação que possa ocorrer

Damien_The_Unbeliever
fonte
2
Okie eu usei PATINDEX. Obrigado!
NLV
1
s / recursivo / aninhado / - "recursivo" seria se REPLACEchamado; "aninhado" é quando o resultado de uma chamada de função é passado imediatamente para outra função.
Fund Monica's Lawsuit
2
O 'ME' diferencia maiúsculas de minúsculas no SQL ou você também precisa fazer uma instrução if para 'Me' e 'me'?
precisa saber é o seguinte
5
@ a.powell - depende do agrupamento envolvido. Você sempre pode forçá-lo neste teste, se precisar, de uma maneira ou de outra. Por exemplo, compare select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')e select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (Em agrupamentos, CSsignifica Case Sensitive e tenho certeza que você pode se exercitar CI).
Damien_The_Unbeliever
2
@VincePanuccio - o processamento de strings do T-SQL é notoriamente fraco. A força do SQL está nas operações baseadas em conjuntos. Nesse caso (desejando fazer o processamento de strings e algo em que uma regex seria uma solução óbvia), é mais o caso deles escolherem a ferramenta errada para o trabalho.
Damien_The_Unbeliever
120

Você pode apenas usar curingas no predicado (depois de IF, WHERE ou ON):

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

ou neste caso específico

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

(Coloque os espaços na cadeia de caracteres citada se estiver procurando a palavra inteira ou deixe-os de fora se ME puder fazer parte de uma palavra maior).

Daniel Quinlan
fonte
3
Se você estiver procurando por correspondências de palavras (seu segundo exemplo), será necessário: a) adicionar um espaço antes e depois de @mainString (para poder corresponder a primeira ou a última palavra) eb) remover a pontuação
Damien_The_Unbeliever
2
Isso é melhor que CHARINDEX () para mim, porque no meu caso particular, não consigo executar a função CHARINDEX () devido a permissões limitadas.
James T Snell
1
(Só não se esqueça de prefixo todas as suas constantes string com Nse sua coluna é um nvarchar, caso contrário você obter conversões por-linha)
Richard Szalay