Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

CHARINDEX() vs PATINDEX() no SQL Server – Qual é a diferença?


No SQL Server, você pode usar o CHARINDEX() ou a função PATINDEX() função para encontrar uma string dentro de uma string. Essas são funções de cadeia de caracteres Transact-SQL e também estão disponíveis em bancos de dados do Azure.

Na superfície, essas funções parecem fazer exatamente a mesma coisa e, em muitos casos, você pode usar o que preferir.

No entanto, existem algumas distinções que podem ditar qual função você decide usar em determinados cenários. Estes podem ser resumidos pelo seguinte:
  • PATINDEX() permite que você use caracteres curinga para pesquisar padrões. CHARINDEX() não.
  • CHARINDEX() aceita um terceiro argumento que permite especificar a posição inicial da pesquisa. PATINDEX() não.

Mais detalhes sobre esses pontos abaixo.


Definição


Primeiro, vamos ver a definição oficial de cada função.
CHARINDEX()
Pesquisa uma expressão de caractere dentro de uma segunda expressão de caractere, retornando a posição inicial da primeira expressão, se encontrada.
PATINDEX()
Retorna a posição inicial da primeira ocorrência de um padrão em uma expressão especificada, ou zeros se o padrão não for encontrado, em todos os tipos de dados de texto e caracteres válidos.

Sintaxe


E aqui está a sintaxe oficial de cada função.

CHARINDEX()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINDEX()

PATINDEX ( '%pattern%' , expression )

Portanto, ambas as funções permitem que você procure uma expressão de caractere, no entanto, o PATINDEX() função permite que você procure um padrão . Portanto, esta é uma funcionalidade extra que você não obtém com o CHARINDEX() função. Com PATINDEX() você pode usar caracteres curinga para especificar um padrão de pesquisa, o que pode ser muito útil em algumas situações.

No entanto, CHARINDEX() aceita três argumentos, enquanto PATINDEX() só aceita dois. O CHARINDEX() A função aceita um terceiro argumento opcional que permite especificar a posição inicial da pesquisa. Em outras palavras, o CHARINDEX() A função permite retornar apenas as correspondências que ocorrem após um determinado ponto na string.

Exemplos


Aqui estão exemplos que demonstram a funcionalidade extra fornecida por cada função.

CHARINDEX()


Aqui, forneço um terceiro argumento para especificar uma posição para iniciar a pesquisa. Neste caso, ele irá pular a primeira ocorrência de Bob e retornará a posição da segunda ocorrência.
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Resultado:
17

Então, como mencionado, você não pode fazer isso com PATINDEX() porque não aceita esse terceiro parâmetro.

PATINDEX()


Agora aqui está um exemplo de algo que você pode fazer com PATINDEX() que você não pode fazer com CHARINDEX() . Neste exemplo, usamos caracteres curinga para procurar um padrão:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Resultado:
11

Neste caso, usamos os sinais de porcentagem (% ) que são curingas para indicar que qualquer número de caracteres pode prosseguir e suceder nossa string de pesquisa. Também usamos o sublinhado (_ ) que é um curinga para qualquer single personagem.

Conclusão


Assim, enquanto ambos CHARINDEX() e PATINDEX() fornecem funcionalidade semelhante e, em muitos casos, qualquer um pode ser usado em vez do outro, há momentos em que você precisa usar um sobre o outro.

Especificamente, você usaria CHARINDEX() quando você deseja especificar uma posição inicial dentro da string a ser pesquisada. E você usaria PATINDEX() sempre que você precisar especificar um padrão para pesquisar.