PATINDEX (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

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

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

Синтаксис

PATINDEX ( '%pattern%' , expression )  

Аргументы

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

Примечание.

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

выражение
Выражение, обычно столбец, в котором производится поиск по указанному шаблону. 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.

Примеры

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

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

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

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

position
--------
3

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

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

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

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

position
--------  
64  

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

C. Использование символов-шаблонов в функции 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.

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

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

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

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

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

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)
Процент символов (подстановочный знак — символы для сопоставления) (Transact-SQL)