v SQL Serveru můžete použít funkci T-SQL PATINDEX()
k nalezení vzoru v řetězci. Konkrétně funkce vrací pouze první výskyt vzoru v řetězci.
funkce přijímá dva argumenty; vzor a řetězec.
ve vzoru můžete použít zástupné znaky.
syntaxe
syntaxe jde takto:
PATINDEX ( '%pattern%' , expression )
Kde vzor je postava, výraz, který obsahuje sekvenci lze nalézt, a výraz je výraz, který má být prohledán.
Příklad 1 – Základní Použití
Tady je příklad, jak to funguje:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Výsledek:
+----------+| Result ||----------|| 12 |+----------+
doplněny znakem procento (%
) je zástupný znak, který představuje libovolný řetězec nula nebo více znaků.
příklad 2-žádná shoda
zde je to, co se stane, když nezahrneme zástupné znaky:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Výsledek:
+----------+| Result ||----------|| 0 |+----------+
i když, pokud celý řetězec odpovídá vzoru, bez jakékoli zástupné znaky, budete mít zápas:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Výsledek:
+----------+| Result ||----------|| 1 |+----------+
Nicméně, nebudete mít zápas, pokud řetězec obsahuje více znaků:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Výsledek:
+----------+| Result ||----------|| 0 |+----------+
V takovém případě můžete použít jeden zástupný znak:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Výsledek:
+----------+| Result ||----------|| 1 |+----------+
můžete také použít jeden zástupný znak někde uprostřed vzor:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Výsledek:
+----------+| Result ||----------|| 1 |+----------+
V tomto případě máme shodu, protože začátek a konec řetězce odpovídající začátek a konec vzoru. Samozřejmě, střed řetězce také odpovídal středu vzoru, protože všechny ostatní znaky jsou pokryty znakem procenta.
příklad 3-zástupný znak podtržítka
zde je další příklad, kde představujeme další zástupný znak:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Výsledek:
+----------+| Result ||----------|| 1 |+----------+
podtržení (_
), což je zástupný znak pro jakýkoliv jednotlivý znak. Proto se bude shodovat pouze v případě, že je v této pozici přesně jedna postava.
výše uvedený vzor by samozřejmě mohl odpovídat mnoha různým řetězcům. Například:
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';
výsledek:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Příklad 4 – Porovnání _ a % Zástupné znaky
Tento příklad demonstruje rozdíl mezi _
%
zástupné znaky.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
Výsledek:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
podtržítko pouze zápasy, když tam je přesně jeden znak v této pozici. Abychom sladili dva znaky, musíme použít dvě podtržítka.
znaménko procenta na druhé straně odpovídá libovolnému počtu znaků, včetně nuly, jak je vidět v následujícím příkladu:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Výsledek:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
Příklad 5 – Databáze Příklad:
Zde je příklad použití této funkce v databázovém dotazu:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
Výsledek:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
V tomto případě jsem pomocí WHERE
klauzule vrátí pouze ty alba, které vlastně zápas, spolu s jejich PATINDEX()
výsledek. Kdybych zrušil klauzuli WHERE
, všechna alba by byla vrácena bez ohledu na to, zda se shodují nebo ne.
pro ty, které se neshodují, bude výsledek PATINDEX()
nulový.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
Výsledek:
+-------------------------+-----------------+| 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 |+-------------------------+-----------------+
Příklad 6 – První Výskyt Pouze
Jak již bylo zmíněno, PATINDEX()
vrátí pouze první výskyt vzoru v řetězci.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Výsledek:
+----------+| Result ||----------|| 5 |+----------+
CHARINDEX() Funkce
T-SQL CHARINDEX()
funkce je podobná PATINDEX()
. Mezi nimi však existují určité rozdíly. Zejména PATINDEX()
přijímá zástupné znaky, ale ne výchozí pozici. CHARINDEX()
na druhé straně přijímá výchozí pozici, ale ne zástupné znaky.