Поделиться через


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

Возвращает начальную позицию первого вхождения шаблона в указанном выражении или ноль, если шаблон не найден, на всех допустимых типах текстовых и символьных данных.

Соглашения о синтаксисе Transact-SQL

Syntax

PATINDEX ( '%pattern%' , expression )

Arguments

pattern

Символьное выражение, содержащее найденную последовательность. 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

Хотя традиционные регулярные выражения изначально не поддерживаются в SQL Server 2022 (16.x) и более ранних версиях, аналогичные сложные сопоставления шаблонов можно достичь с помощью различных подстановочных выражений. See the String operators documentation for more detail on wildcard syntax. Сведения о функциях регулярного выражения в предварительной версии SQL Server 2025 (17.x) см. в разделе "Функции регулярных выражений".

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.

Если выражение равно NULL, PATINDEX возвращает ошибку.

Начальная позиция для PATINDEX .1

PATINDEX выполняет сравнения на основе сортировки входных данных. Чтобы выполнить сравнение в указанной сортировке, можно использовать COLLATE для применения явной сортировки к входным данным.

Дополнительные символы (суррогатные пары)

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. Для получения дополнительной информации см. Сортировка и поддержка Юникода.

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

Examples

A. Базовый пример PATINDEX

В приведенном ниже примере в короткой строке символов (interesting data) проверяется начальная позиция символов ter.

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

Вот результирующий набор.

position
--------
3

B. Использование шаблона с PATINDEX

В следующем примере обнаруживается позиция, с которой начинается шаблон ensure в определенной строке столбца DocumentSummary в таблице в Document базе данных AdventureWorks2022.

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

Вот результирующий набор.

position
--------
64

Если вы не ограничиваете поиск строк с помощью WHERE предложения, запрос возвращает все строки таблицы и сообщает ненулевое значение для этих строк, в которых найден шаблон, и ноль для всех строк, в которых шаблон не найден.

C. Использование подстановочных знаков с ПОМОЩЬЮ PATINDEX

В следующих примерах символы-шаблоны % и _ используются для поиска позиции, где в указанной строке (индекс начинается с позиции 1) начинается шаблон 'en', за которым следует один любой символ и 'ure':

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

Вот результирующий набор.

position
--------
8

PATINDEX работает аналогично LIKE, то есть можно можно использовать любой из этих шаблонов. Вам не нужно заключать шаблон между процентами. PATINDEX('a%', 'abc') возвращает 1 и PATINDEX('%a', 'cba') возвращает 3.

В отличие от LIKE, PATINDEX возвращает позицию, аналогично CHARINDEX.

D. Использование сложных подстановочных знаков с ПОМОЩЬЮ 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;

Вот результирующий набор.

position
--------
33

E. Использование COLLATE с PATINDEX

Следующий пример показывает, как функция COLLATE явно определяет параметры сортировки при поиске в выражении.

USE tempdb;
GO

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

Вот результирующий набор.

position
--------
9

F. Использование переменной для указания шаблона

The following example uses a variable to pass a value to the pattern parameter. В этом примере используется база данных AdventureWorks2022.

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

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

Вот результирующий набор.

position
--------
22