i SQL Server kan du använda funktionen T-SQL PATINDEX()
för att hitta ett mönster i en sträng. Specifikt returnerar funktionen endast den första förekomsten av mönstret i strängen.
funktionen accepterar två argument; mönstret och strängen.
Du kan använda jokertecken i mönstret.
Syntax
syntaxen går så här:
PATINDEX ( '%pattern%' , expression )
där mönster är ett teckenuttryck som innehåller sekvensen som ska hittas och uttryck är uttrycket som ska sökas.
exempel 1 – Grundläggande användning
här är ett exempel på hur det fungerar:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
resultat:
+----------+| Result ||----------|| 12 |+----------+
procenttecknet (%
) är ett jokertecken som representerar alla sträng med noll eller fler tecken.
exempel 2-ingen matchning
här är vad som händer när vi inte inkluderar jokertecken:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
resultat:
+----------+| Result ||----------|| 0 |+----------+
Även om hela strängen matchar mönstret utan jokertecken får du en matchning:
SELECT PATINDEX('Bob', 'Bob') AS Result;
resultat:
+----------+| Result ||----------|| 1 |+----------+
du får dock ingen matchning om strängen innehåller fler tecken:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
resultat:
+----------+| Result ||----------|| 0 |+----------+
i vilket fall du kan använda ett enda jokertecken:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
resultat:
+----------+| Result ||----------|| 1 |+----------+
Du kan också använda ett enda jokertecken någonstans mitt i mönstret:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
resultat:
+----------+| Result ||----------|| 1 |+----------+
i det här fallet fick vi en matchning eftersom början och slutet av strängen matchade starten och slutet på mönstret. Naturligtvis matchade mitten av strängen också mitten av mönstret, eftersom alla andra tecken täcks av procenttecknet.
exempel 3-Understrecket jokertecken
Här är ett annat exempel där vi introducerar ett annat jokertecken:
SELECT PATINDEX('B_er', 'Beer') AS Result;
resultat:
+----------+| Result ||----------|| 1 |+----------+
understrecket (_
) som är ett jokertecken för ett enskilt tecken. Därför kommer det bara att matcha om det finns exakt ett tecken i den positionen.
naturligtvis kan ovanstående mönster matcha många olika strängar. Till exempel:
SELECT PATINDEX('B_er', 'Beer') AS 'Beer', PATINDEX('B_er', 'Bier') AS 'Bier', PATINDEX('B_er', 'Baer') AS 'Baer', PATINDEX('B_er', 'B er') AS 'B er';
resultat:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
exempel 4 – jämföra _ och % jokertecken
detta exempel visar skillnaden mellan_
och%
jokertecken.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
resultat:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
understrecket matchar bara när det finns exakt ett tecken i den positionen. För att matcha två tecken måste vi använda två understreck.
det procentuella tecknet å andra sidan matchar valfritt antal tecken, inklusive noll, vilket ses i följande exempel:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
resultat:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
exempel 5 – ett Databasexempel
här är ett exempel på att använda denna funktion i en databasfråga:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
resultat:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
i det här fallet använder jagWHERE
klausul för att bara returnera de album som faktiskt matchar, tillsammans med derasPATINDEX()
resultat. Om jag tappade WHERE
– klausulen skulle alla album ha returnerats, oavsett om de matchade eller inte.
för de som inte matchade skulle resultatetPATINDEX()
vara noll.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
resultat:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Powerslave | 0 || Powerage | 0 || Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || Casualties of Cool | 0 || Epicloud | 0 || Somewhere in Time | 0 || Piece of Mind | 0 || Killers | 0 || No Prayer for the Dying | 15 |+-------------------------+-----------------+
exempel 6 – Endast första förekomsten
som nämnts returnerarPATINDEX()
endast den första förekomsten av mönstret i strängen.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
resultat:
+----------+| Result ||----------|| 5 |+----------+
CHARINDEX ()-funktionen
T-SQLCHARINDEX()
– funktionen liknarPATINDEX()
. Det finns dock vissa skillnader mellan de två. I synnerhet accepterarPATINDEX()
jokertecken, men inte en startposition. CHARINDEX()
å andra sidan accepterar en startposition, men inte jokertecken.