PATINDEX (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i 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. Jokerkaraktärer kan användas; dock måste % karaktär komma före och följa mönster (förutom när du söker efter första eller sista tecknet). Mönster är ett uttryck för teckensträngens datatypkategori. Pattern är begränsat till 8 000 tecken.

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. Se dokumentationen för strängoperatorer för mer detaljer om jokerkortssyntax. För information om reguljära uttrycksfunktioner i SQL Server 2025 (17.x), se Reguljära uttrycksfunktioner.

expression

Ett uttryck, vanligtvis en kolumn som söks efter det specificerade mönstret. uttrycket tillhör kategorin teckensträngsdatatyp.

Returtyper

bigint om uttrycket är av varchar(max) - eller nvarchar(max) -datatyperna; annars int.

Remarks

Om mönstret är NULL, PATINDEX returnerar 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)

När du använder kollationer med kompletterande tecken (SC) räknar returvärdet alla UTF-16-surrogatpar i uttrycksparametern som ett enda tecken. För mer information, se Sortering och Unicode-stöd.

0x0000 (char(0)) är ett odefinierat tecken i Windows-sortering och kan inte inkluderas i 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

Följande exempel hittar platsen där mönstret ensure startar i en specifik rad i DocumentSummary kolumnen Document i tabellen i AdventureWorks2025-databasen.

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

Följande exempel använder [^] för att hitta positionen för ett tecken som inte är ett tal, en bokstav eller ett mellanslag.

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

Följande exempel använder en variabel för att skicka ett värde till mönsterparametern . Detta exempel använder AdventureWorks2025-databasen.

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

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

Här är resultatet.

position
--------
22