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

Como encontrar uma string dentro de uma string no SQL Server


No SQL Server, você pode usar o T-SQL CHARINDEX() ou a função PATINDEX() função para encontrar uma string dentro de outra string. Aqui está uma visão geral rápida de cada função.

A função CHARINDEX()


Esta função aceita 3 argumentos; a string a ser localizada, a string a ser pesquisada e uma posição inicial opcional.

O CHARINDEX() sintaxe fica assim:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

Onde expressionToFind é a expressão que você deseja encontrar na outra string e expressionToSearch é a outra cadeia. O opcional start_location pode ser usado para especificar uma posição dentro de expressionToSearch para começar a procurar.

Observe que apenas a posição da primeira ocorrência é retornada.


Exemplo


Aqui está um exemplo:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');

Resultado:
1

Neste exemplo, o primeiro argumento é Bob , o que significa que estamos pesquisando o segundo argumento para Bob . O resultado é 1 porque essa é a posição em que Bob aparece primeiro no segundo argumento.

Você também pode notar que Bob na verdade, aparece duas vezes na string, mas apenas a posição da primeira correspondência é retornada.

Sem correspondência


Se o segundo argumento não contiver Bob o resultado teria sido 0 .
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');

Resultado:
0

Especificando uma posição inicial


Você pode especificar uma posição inicial para onde começar a pesquisa. Isso significa que o SQL Server ignorará qualquer ocorrência anterior a essa posição inicial. No entanto, os resultados ainda são relatados com base em sua posição na string (não na posição inicial).

Se isso parece confuso, o exemplo a seguir deve ajudar:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Resultado:
17

Portanto, neste exemplo, começamos a pesquisar na posição 16 (que é o espaço antes do 2º Bob ). O resultado é que a primeira ocorrência de Bob é ignorado e a posição do segundo é retornada. E podemos ver que sua posição é de 17 caracteres desde o início da string (mesmo sendo apenas um caractere de onde começamos a busca).

Sensibilidade a maiúsculas e minúsculas


Você pode executar explicitamente uma pesquisa com distinção entre maiúsculas e minúsculas adicionando a cláusula COLLATE à sua instrução SELECT:

Sensibilidade a maiúsculas e minúsculas


Aqui está uma pesquisa que diferencia maiúsculas de minúsculas:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);

Resultado:
0

Isso diferencia maiúsculas de minúsculas porque _CS significa sensível a maiúsculas e minúsculas.

Não diferencia maiúsculas de minúsculas


E aqui está uma pesquisa que não diferencia maiúsculas de minúsculas:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);

Resultado:
11

Isso não diferencia maiúsculas de minúsculas porque _CI significa Case-Insensitive.

A função PATINDEX()


O PATINDEX() função faz um trabalho semelhante a CHARINDEX() . Você basicamente tem uma escolha de qual usar. A principal diferença está na sintaxe.

O PATINDEX() a sintaxe da função é assim:
PATINDEX ( '%pattern%' , expression )

Onde padrão é uma expressão de caracteres que contém a sequência a ser encontrada e expressão é a expressão a ser pesquisada (normalmente uma coluna).

O PATINDEX() aceita caracteres curinga, mas não uma posição inicial. CHARINDEX() por outro lado, aceita uma posição inicial, mas não caracteres curinga.

Exemplos


Aqui está um exemplo:
SELECT PATINDEX('%eer%', 'Bob likes beer.');

Resultado:
12

No entanto, aqui está o que acontece quando não incluímos os caracteres curinga:
SELECT PATINDEX('eer', 'Bob likes beer.');

Resultado:
0

Aqui está outro exemplo em que introduzimos outro caractere curinga:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Resultado:
11

Neste caso, o sublinhado (_ ) que é um curinga para qualquer caractere único.