no servidor SQL, você pode usar a função T-SQL PATINDEX()
para encontrar um padrão dentro de uma cadeia de caracteres. Especificamente, a função só retorna a primeira ocorrência do padrão dentro da string.
a função aceita dois argumentos; o padrão e a cadeia de caracteres.
pode usar caracteres especiais dentro do padrão.
sintaxe
a sintaxe é assim:
PATINDEX ( '%pattern%' , expression )
where pattern is a character expression that contains the sequence to be found, and expression is the expression to be searched.
Exemplo 1 – Uso Básico
Aqui está um exemplo de como funciona:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 12 |+----------+
O sinal de percentagem (%
) é um caractere curinga que representa qualquer seqüência de zero ou mais caracteres.
Exemplo 2 – nenhuma correspondência
Aqui está o que acontece quando não incluímos os caracteres especiais:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 0 |+----------+
Apesar de que, se a cadeia completa o padrão de correspondência, sem qualquer curingas, você receberá uma correspondência:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
no Entanto, você não vai obter um resultado se a seqüência de caracteres contém mais caracteres:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 0 |+----------+
nesse caso, você poderia usar um curinga:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
Você também pode usar um curinga em algum lugar no meio do padrão:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
neste caso temos um jogo, porque o início e o fim da seqüência de caracteres de correspondência de início e final do padrão. Claro, o meio da cadeia também correspondia ao meio do padrão, porque todos os outros caracteres são cobertos pelo sinal percentual.
exemplo 3-a sequência de caracteres especiais
Aqui está outro exemplo em que introduzimos outro carácter de caracteres especiais:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Resultado:
+----------+| Result ||----------|| 1 |+----------+
O carácter de sublinhado (_
), que é um curinga para qualquer caractere único. Portanto, só vai corresponder se houver exactamente um personagem nessa posição.
claro, o padrão acima pode corresponder a muitas cadeias de caracteres diferentes. Por exemplo:
SELECT PATINDEX('B_er', 'Beer') AS 'Beer', PATINDEX('B_er', 'Bier') AS 'Bier', PATINDEX('B_er', 'Baer') AS 'Baer', PATINDEX('B_er', 'B er') AS 'B er';
resultado:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Exemplo 4 – Comparando a _ e % Curingas
Este exemplo demonstra a diferença entre o _
e %
caracteres curinga.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
resultado:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
o sublinhado só corresponde quando há exactamente um carácter nessa posição. Para combinar dois caracteres, precisamos de usar dois subconjuntos.
O sinal percentual, por outro lado, corresponde a qualquer número de caracteres, incluindo zero, como se vê no exemplo seguinte::
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Resultado:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
Exemplo 5 – Um Exemplo de Banco de dados
Aqui está um exemplo de como usar esta função em uma consulta de banco de dados:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
Resultado:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
neste caso eu uso o WHERE
cláusula para retornar apenas os álbuns que, na verdade, corresponde, juntamente com o seu PATINDEX()
resultado. Se eu deixasse cair a cláusula WHERE
, todos os álbuns teriam sido devolvidos, independentemente de corresponderem ou não.
para aqueles que não coincidem, o resultado de PATINDEX()
seria zero.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
Resultado:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Powerslave | 0 || Powerage | 0 || Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || Casualties of Cool | 0 || Epicloud | 0 || Somewhere in Time | 0 || Piece of Mind | 0 || Killers | 0 || No Prayer for the Dying | 15 |+-------------------------+-----------------+
Exemplo 6 – Primeira Ocorrência Apenas
Como mencionado, PATINDEX()
retorna somente a primeira ocorrência do padrão dentro da cadeia.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Resultado:
+----------+| Result ||----------|| 5 |+----------+
A Função CHARINDEX ()
O T-SQL CHARINDEX()
função é semelhante a PATINDEX()
. No entanto, existem algumas diferenças entre os dois. Em particular, o PATINDEX()
aceita caracteres especiais, mas não uma posição inicial. CHARINDEX()
por outro lado, aceita uma posição inicial, mas não caracteres especiais.