Compartilhar via


PATINDEX (Transact-SQL)

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

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

Convenções de sintaxe de Transact-SQL

Syntax

PATINDEX ( '%pattern%' , expression )

Arguments

pattern

Uma expressão de caractere que contém a sequência a ser encontrada. Wildcard characters can be used; however, the % character must come before and follow pattern (except when you search for first or last characters). pattern is an expression of the character string data type category. pattern is limited to 8,000 characters.

Note

Embora expressões regulares tradicionais não sejam compatíveis nativamente no SQL Server 2022 (16.x) e em versões anteriores, a correspondência de padrões complexos semelhantes pode ser obtida usando várias expressões curinga. See the String operators documentation for more detail on wildcard syntax. Para obter informações sobre funções de expressão regulares na versão prévia do SQL Server 2025 (17.x), consulte as funções de expressões regulares.

expression

An expression, typically a column that is searched for the specified pattern. expression is of the character string data type category.

Return types

bigint if expression is of the varchar(max) or nvarchar(max) data types; otherwise int.

Remarks

If pattern is NULL, PATINDEX returns NULL.

Se a expressão for NULL, PATINDEX retornará um erro.

A posição inicial é PATINDEX1.

PATINDEX executa comparações com base na ordenação da entrada. Para executar uma comparação em uma ordenação especificada, você pode usar COLLATE para aplicar uma ordenação explícita à entrada.

Caracteres complementares (pares substitutos)

When you use collations with supplementary characters (SC), the return value counts any UTF-16 surrogate pairs in the expression parameter as a single character. Para obter mais informações, consulte Suporte para ordenação e Unicode.

0x0000 (char(0)) is an undefined character in Windows collations and can't be included in PATINDEX.

Examples

A. Exemplo básico de PATINDEX

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

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

Veja a seguir o conjunto de resultados.

position
--------
3

B. Usar 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 PATINDEX('%ensure%', DocumentSummary) AS position
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 WHERE cláusula, a consulta retornará todas as linhas da tabela e relatará valores não zero para as linhas em que o padrão foi encontrado e zero para todas as linhas em que o padrão não foi encontrado.

C. Usar 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 PATINDEX('%en_ure%', 'Please ensure the door is locked!') AS position;

Veja a seguir o conjunto de resultados.

position
--------
8

PATINDEX funciona da mesma forma que LIKE, então você pode usar qualquer curinga. Você não precisa 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. Usar expressões curinga complexas com PATINDEX

The following example uses the [^]string operator to find the position of a character that isn't a number, letter, or space.

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

Veja a seguir o conjunto de resultados.

position
--------
33

E. Usar 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. Usar uma variável para especificar o padrão

The following example uses a variable to pass a value to the pattern parameter. Este exemplo usa o banco de dados AdventureWorks2022.

DECLARE @MyValue AS VARCHAR (10) = 'safety';

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

Veja a seguir o conjunto de resultados.

position
--------
22