PATINDEX (Transact-SQL)

Область применения:yesSQL Server (все поддерживаемые версии) YesБаза данных SQL Azure YesУправляемый экземпляр SQL Azure yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

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

Topic link iconСинтаксические обозначения в Transact-SQL

Синтаксис

PATINDEX ( '%pattern%' , expression )  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

pattern
Символьное выражение, содержащее последовательность символов, которую надо найти. Можно использовать подстановочные знаки. При этом символ "%" должен указываться до и после аргумента pattern (за исключением случаев, когда производится поиск первых или последних символов). pattern представляет собой выражение из категории типа данных "символьная строка". Максимальная длина pattern — 8000 символов.

Примечание

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

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

Типы возвращаемых данных

bigint, если expression имеет тип данных varchar(max) или nvarchar(max); в противном случае int.

Комментарии

Если аргумент pattern или expression имеет значение NULL, функция PATINDEX возвращает значение NULL.

Начальная позиция PATINDEX — это 1.

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

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

При использовании параметров сортировки SC возвращаемое значение рассматривает любые суррогатные пары UTF-16 в параметре expression как один символ. Дополнительные сведения см. в статье Collation and Unicode Support.

Символ 0x0000 (char(0)) не определен в параметрах сортировки Windows, и его нельзя включать в PATINDEX.

Примеры

A. Простой пример использования функции PATINDEX

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

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

Результирующий набор:

position
--------
3

Б. Использование шаблона в функции PATINDEX

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

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

Результирующий набор:

position
--------  
64  

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

В. Использование символов-шаблонов в функции PATINDEX

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

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

Результирующий набор:

position
--------  
8  

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

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

Г. Использование сложных выражений с подстановочными знаками с PATINDEX

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

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

Результирующий набор:

position
--------
33

Д. Использование предложения COLLATE в функции PATINDEX

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

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

Результирующий набор:

position
--------
9

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

В приведенном ниже примере значение передается в параметр pattern с помощью переменной. В этом примере используется база данных AdventureWorks2012.

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

Результирующий набор:

position
--------  
22

См. также:

LIKE (Transact-SQL)
CHARINDEX (Transact-SQL)
LEN (Transact-SQL)
Типы данных (Transact-SQL)
Строковые функции (Transact-SQL)
(подстановочный знак — символы для сопоставления) (Transact-SQL)
(символы-шаблоны не для сопоставления) (Transact-SQL)
_ (шаблон — совпадение одного символа) (Transact-SQL)
Символ процента (Cимволы-шаблоны совпадения) (Transact-SQL)