Dela 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

Returnerar startpositionen för den första förekomsten av ett mönster i ett angivet uttryck, eller noll om mönstret inte hittas, på alla giltiga text- och teckendatatyper.

Transact-SQL syntaxkonventioner

Syntax

PATINDEX ( '%pattern%' , expression )

Arguments

pattern

Ett teckenuttryck som innehåller sekvensen som ska hittas. 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

Traditionella reguljära uttryck stöds inte internt i SQL Server 2022 (16.x) och tidigare versioner, men liknande komplex mönstermatchning kan uppnås med hjälp av olika jokerteckenuttryck. See the String operators documentation for more detail on wildcard syntax. Information om reguljära uttrycksfunktioner i SQL Server 2025 (17.x) Förhandsversion finns i Funktioner för reguljära uttryck.

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.

Om uttrycket är NULLreturneras PATINDEX ett fel.

Startpositionen för PATINDEX är 1.

PATINDEX utför jämförelser baserat på sortering av indata. Om du vill göra en jämförelse i en angiven sortering kan du använda COLLATE för att tillämpa en explicit sortering på indata.

Tilläggstecken (surrogatpar)

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. För mer information, se Sortering och Unicode-stöd.

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

Examples

A. Exempel på grundläggande PATINDEX

I följande exempel kontrolleras en kort teckensträng (interesting data) för startplatsen för tecknen ter.

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

Här är resultatet.

position
--------
3

B. Använda ett mönster med PATINDEX

I följande exempel hittar du den position där mönstret ensure börjar på en viss rad DocumentSummary i kolumnen i Document tabellen i databasen AdventureWorks2022.

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

Här är resultatet.

position
--------
64

Om du inte begränsar de rader som ska genomsökas med hjälp av en WHERE sats returnerar frågan alla rader i tabellen och rapporterar icke-nollvärden för de rader där mönstret hittades och noll för alla rader där mönstret inte hittades.

C. Använda jokertecken med PATINDEX

I följande exempel används % och _ jokertecken för att hitta positionen där mönstret 'en', följt av ett tecken och 'ure' startar i den angivna strängen (index börjar vid 1):

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

Här är resultatet.

position
--------
8

PATINDEX fungerar precis som LIKE, så att du kan använda något av jokertecken. Du behöver inte omsluta mönstret mellan procent. PATINDEX('a%', 'abc') returnerar 1 och PATINDEX('%a', 'cba') returnerar 3.

Till skillnad från LIKEreturnerar PATINDEX en position som liknar vad CHARINDEX som gör.

D. Använda komplexa jokerteckenuttryck med 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;

Här är resultatet.

position
--------
33

E. Använda COLLATE med PATINDEX

I följande exempel används COLLATE funktionen för att uttryckligen ange sortering av det uttryck som söks igenom.

USE tempdb;
GO

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

Här är resultatet.

position
--------
9

F. Använd en variabel för att ange mönstret

The following example uses a variable to pass a value to the pattern parameter. I det här exemplet används databasen AdventureWorks2022.

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

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

Här är resultatet.

position
--------
22