V SQL Server můžete použít T-SQL PATINDEX()
funkce 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 vypadá takto:
PATINDEX ( '%pattern%' , expression )
Kde vzor je znakový výraz, který obsahuje sekvenci, která má být nalezena, a výraz je výraz, který má být prohledán.
Příklad 1 – Základní použití
Zde je příklad, jak to funguje:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Výsledek:
+----------+ | Result | |----------| | 12 | +----------+
Znak procenta (%
) je zástupný znak, který představuje libovolný řetězec nula nebo více znaků.
Příklad 2 – Žádná shoda
Když nezahrneme zástupné znaky, stane se toto:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Výsledek:
+----------+ | Result | |----------| | 0 | +----------+
Pokud se však celý řetězec shoduje se vzorem bez jakýchkoli zástupných znaků, dostanete shodu:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Výsledek:
+----------+ | Result | |----------| | 1 | +----------+
Pokud však řetězec obsahuje více znaků, nedosáhnete shody:
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 vzoru:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Výsledek:
+----------+ | Result | |----------| | 1 | +----------+
V tomto případě jsme dostali shodu, protože začátek a konec řetězce odpovídal začátku a konci vzoru. Střed řetězce samozřejmě také odpovídal středu vzoru, protože všechny ostatní znaky jsou zakryty znakem procenta.
Příklad 3 – Zástupný znak podtržítka
Zde je další příklad, kde zavádíme další zástupný znak:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Výsledek:
+----------+ | Result | |----------| | 1 | +----------+
Podtržítko (_
), což je zástupný znak pro jakýkoli jednotlivý znak. Proto se bude shodovat pouze v případě, že je na této pozici přesně jeden znak.
Samozřejmě, že výše uvedený vzor by 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 ukazuje rozdíl mezi _
a %
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 se shoduje pouze tehdy, když je na dané pozici přesně jeden znak. Abychom porovnali dva znaky, musíme použít dvě podtržítka.
Na druhé straně znak procenta 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 – Příklad databáze
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 Albums WHERE 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ě používám WHERE
klauzule vrátit pouze ta alba, která se skutečně shodují, spolu s jejich PATINDEX()
výsledek. Pokud jsem vypustil WHERE
klauzule, všechna alba by byla vrácena bez ohledu na to, zda se shodovala nebo ne.
Pro ty, které neodpovídají, PATINDEX()
výsledek by byl nula.
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 – Pouze první výskyt
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á funkci PATINDEX()
. Mezi těmito dvěma jsou však určité rozdíly. Konkrétně PATINDEX()
přijímá zástupné znaky, ale ne výchozí pozici. CHARINDEX()
na druhé straně přijímá počáteční pozici, ale ne zástupné znaky.