PATINDEX (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric

Retorna a posição inicial da primeira ocorrência de um padrão em uma expressão específica ou zero, se o padrão não for encontrado, em todos os tipos de dados de caractere e de texto válidos.

Convenções de sintaxe de Transact-SQL

Sintaxe

PATINDEX ( '%pattern%' , expression )  

Argumentos

padrão
É uma expressão de caractere que contém a sequência a ser localizada. Caracteres curinga podem ser usados; entretanto, o caractere % deve vir antes e seguir pattern (exceto quando você pesquisa o primeiro e último caracteres). pattern é uma expressão da categoria de tipo de dados de cadeia de caracteres. pattern é limitado a 8.000 caracteres.

Observação

Embora as expressões regulares tradicionais não sejam nativamente compatíveis no SQL Server, a correspondência de padrões complexos semelhantes pode ser obtida com o uso de várias expressões curinga. Confira a documentação de Operações de cadeia de caracteres para obter mais detalhes sobre a sintaxe do curinga.

expressão
É uma expression, geralmente, uma coluna na qual procurar o padrão especificado. expression é uma expressão da categoria de tipo de dados de cadeia de caracteres.

Tipos de retorno

bigint se expression é dos tipos de dados varchar(max) ou nvarchar(max); caso contrário, int.

Comentários

Se pattern ou expression for NULL, PATINDEX retornará NULL.

A posição inicial para PATINDEX é 1.

PATINDEX executa comparações com base na ordenação da entrada. Para fazer uma comparação em uma ordenação especificada, use COLLATE para aplicar uma ordenação explícita à entrada.

Caracteres suplementares (pares substitutos)

Ao usar ordenações SC, o valor retornado contará os pares alternativos UTF-16 no parâmetro expression como um caractere único. Para obter mais informações, consulte Suporte a ordenações e a Unicode.

0x0000 (char(0)) é um caractere indefinido em ordenações do Windows e não pode ser incluído em PATINDEX.

Exemplos

a. Exemplo simples de PATINDEX

O exemplo a seguir verifica uma cadeia de caracteres curta (interesting data) em busca do local inicial dos caracteres ter.

SELECT position = PATINDEX('%ter%', 'interesting data');  

Veja a seguir o conjunto de resultados.

position
--------
3

B. Usando um padrão com PATINDEX

O exemplo a seguir localiza a posição na qual o padrão ensure inicia em uma linha específica da coluna DocumentSummary da tabela Document no banco de dados AdventureWorks2022.

SELECT position = PATINDEX('%ensure%',DocumentSummary)  
FROM Production.Document  
WHERE DocumentNode = 0x7B40;  
GO   

Veja a seguir o conjunto de resultados.

position
--------  
64  

Se você não restringir as linhas a serem pesquisadas usando uma cláusula WHERE, a consulta retornará todas as linhas na tabela e registrará valores diferentes de zero para as linhas nas quais o padrão foi localizado e zero para todas as linhas nas quais o padrão não foi localizado.

C. Usando caracteres curinga com PATINDEX

O exemplo a seguir usa os curingas % e _ para localizar a posição na qual o padrão 'en', seguido de qualquer outro caractere e 'ure' é iniciado na cadeia de caracteres especificada (o índice inicia em 1):

SELECT position = PATINDEX('%en_ure%', 'Please ensure the door is locked!');  

Veja a seguir o conjunto de resultados.

position
--------  
8  

PATINDEX funciona da mesma forma que LIKE, então você pode usar qualquer curinga. Não é necessário colocar o padrão entre porcentagens. PATINDEX('a%', 'abc') retorna 1 e PATINDEX('%a', 'cba') retorna 3.

Diferentemente de LIKE, PATINDEX retorna uma posição, semelhante ao que CHARINDEX faz.

D. Usando expressões curinga complexas com PATINDEX

O exemplo a seguir usa o operador de cadeia de caracteres [^] para localizar a posição de um caractere que não é um número, uma letra ou um espaço.

SELECT position = PATINDEX('%[^ 0-9A-Za-z]%', 'Please ensure the door is locked!'); 

Veja a seguir o conjunto de resultados.

position
--------
33

E. Usando COLLATE com PATINDEX

O exemplo a seguir usa a função COLLATE para especificar explicitamente a ordenação da expressão que é pesquisada.

USE tempdb;  
GO  
SELECT PATINDEX ( '%ein%', 'Das ist ein Test'  COLLATE Latin1_General_BIN) ;  
GO  

Veja a seguir o conjunto de resultados.

position
--------
9

F. Usando uma variável para especificar o padrão

O exemplo a seguir usa uma variável para passar um valor para o parâmetro pattern. Este exemplo usa o banco de dados AdventureWorks2022.

DECLARE @MyValue VARCHAR(10) = 'safety';   
SELECT position = PATINDEX('%' + @MyValue + '%', DocumentSummary)   
FROM Production.Document  
WHERE DocumentNode = 0x7B40;  

Veja a seguir o conjunto de resultados.

position
--------  
22

Confira também

LIKE (Transact-SQL)
CHARINDEX (Transact-SQL)
LEN (Transact-SQL)
Tipos de dados (Transact-SQL)
Funções de cadeia de caracteres (Transact-SQL)
(Curinga – caracteres para correspondência) (Transact-SQL)
(Curinga – caracteres para não correspondência) (Transact-SQL)
_ (Curinga – corresponde a um caractere) (Transact-SQL)
Caractere de porcentagem (Curinga - Caracteres de Correspondência) (Transact-SQL)