în SQL Server, puteți utiliza funcția T-SQLPATINDEX()
pentru a găsi un model într-un șir. Mai exact, funcția returnează doar prima apariție a modelului în șir.
funcția acceptă două argumente; modelul și șirul.
puteți utiliza caractere wildcard în cadrul modelului.
sintaxa
sintaxa merge astfel:
PATINDEX ( '%pattern%' , expression )
unde modelul este o expresie de caracter care conține secvența care trebuie găsită, iar expresia este expresia care trebuie căutată.
Exemplul 1 – utilizare de bază
Iată un exemplu de cum funcționează:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
rezultat:
+----------+| Result ||----------|| 12 |+----------+
semnul procentual (%
) este un caracter wildcard care reprezintă orice șir de zero sau mai multe caractere.
Exemplul 2 – fără potrivire
iată ce se întâmplă când nu includem caracterele wildcard:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
rezultat:
+----------+| Result ||----------|| 0 |+----------+
deși, dacă șirul complet se potrivește cu modelul fără metacaractere, veți obține o potrivire:
SELECT PATINDEX('Bob', 'Bob') AS Result;
rezultat:
+----------+| Result ||----------|| 1 |+----------+
cu toate acestea, nu veți obține o potrivire dacă șirul conține mai multe caractere:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
rezultat:
+----------+| Result ||----------|| 0 |+----------+
caz în care puteți folosi un singur wildcard:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
rezultat:
+----------+| Result ||----------|| 1 |+----------+
ai putea folosi, de asemenea, un singur wildcard undeva în mijlocul modelului:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
rezultat:
+----------+| Result ||----------|| 1 |+----------+
în acest caz, avem o potrivire, deoarece începutul și sfârșitul șirului se potriveau cu începutul și sfârșitul modelului. Desigur, mijlocul șirului se potrivea și cu mijlocul modelului, deoarece toate celelalte caractere sunt acoperite de semnul procentual.
Exemplul 3-Wildcard subliniere
Iată un alt exemplu în cazul în care vom introduce un alt caracter wildcard:
SELECT PATINDEX('B_er', 'Beer') AS Result;
rezultat:
+----------+| Result ||----------|| 1 |+----------+
sublinierea (_
) care este un wildcard pentru orice caracter. Prin urmare, se va potrivi numai dacă există exact un caracter în acea poziție.desigur, modelul de mai sus ar putea potrivi Mai multe siruri de caractere diferite. De exemplu:
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';
rezultat:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Exemplul 4 – compararea _ și % wildcard
acest exemplu demonstrează diferența dintre_
și%
caractere wildcard.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
rezultat:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
sublinierea se potrivește doar atunci când există exact un caracter în acea poziție. Pentru a potrivi două caractere, trebuie să folosim două subliniere.
semnul procentual pe de altă parte, se potrivește cu orice număr de caractere, inclusiv zero, așa cum se vede în exemplul următor:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
rezultat:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
exemplul 5 – un exemplu de bază de date
Iată un exemplu de utilizare a acestei funcții într-o interogare a bazei de date:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
rezultat:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
în acest caz folosesc clauza WHERE
pentru a returna doar acele albume care se potrivesc efectiv, împreună cu rezultatul lor PATINDEX()
. Dacă renunțam la clauzaWHERE
, toate albumele ar fi fost returnate, indiferent dacă se potriveau sau nu.
pentru cei care nu se potrivesc,PATINDEX()
rezultatul ar fi zero.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
rezultat:
+-------------------------+-----------------+| 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 |+-------------------------+-----------------+
exemplul 6 – numai prima apariție
după cum sa menționat,PATINDEX()
returnează numai prima apariție a modelului în șir.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
rezultat:
+----------+| Result ||----------|| 5 |+----------+
funcția CHARINDEX ()
T-SQLCHARINDEX()
funcția este similară cuPATINDEX()
. Cu toate acestea, există unele diferențe între cele două. În special, PATINDEX()
acceptă caractere wildcard, dar nu o poziție de pornire. CHARINDEX()
pe de altă parte acceptă o poziție de pornire, dar nu și caractere wildcard.