V SQL Server můžete použít T-SQL CHARINDEX()
nebo PATINDEX()
funkce k nalezení řetězce v jiném řetězci. Zde je rychlý přehled každé funkce.
Funkce CHARINDEX()
Tato funkce přijímá 3 argumenty; řetězec, který se má najít, řetězec, který se má hledat, a volitelná počáteční pozice.
CHARINDEX()
syntaxe vypadá takto:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
Kde expressionToFind je výraz, který chcete najít v druhém řetězci, a expressionToSearch je druhý řetězec. Volitelné start_location lze použít k určení pozice v rámci expressionToSearch které začít hledat.
Všimněte si, že je vrácena pouze pozice prvního výskytu.
Příklad
Zde je příklad:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
Výsledek:
1
V tomto příkladu je prvním argumentem Bob
, což znamená, že hledáme druhý argument pro Bob
. Výsledek je 1, protože to je pozice, kde Bob
první se objeví ve druhém argumentu.
Můžete si také všimnout, že Bob
ve skutečnosti se v řetězci objeví dvakrát, ale vrátí se pouze pozice první shody.
Žádná shoda
Pokud druhý argument neobsahoval Bob
výsledek by byl 0
.
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
Výsledek:
0
Určení počáteční pozice
Můžete určit počáteční pozici pro zahájení vyhledávání. To znamená, že SQL Server přeskočí jakýkoli výskyt, který nastane před počáteční pozicí. Výsledky jsou však stále hlášeny na základě jeho pozice v řetězci (nikoli z počáteční pozice).
Pokud to zní zmateně, měl by pomoci následující příklad:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Výsledek:
17
V tomto příkladu tedy začneme hledat na pozici 16 (což je shodou okolností mezera před 2. Bob
). Výsledkem je první výskyt Bob
je přeskočen a pozice druhého je vrácena. A vidíme, že jeho pozice je 17 znaků od začátku řetězce (i když je to jen jeden znak od místa, kde jsme začali hledat).
Rozlišování malých a velkých písmen
Můžete explicitně provést vyhledávání rozlišující malá a velká písmena přidáním klauzule COLLATE do příkazu SELECT:
Rozlišují se malá a velká písmena
Zde je vyhledávání rozlišující malá a velká písmena:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
Výsledek:
0
Rozlišují se malá a velká písmena, protože _CS
je zkratka pro Case-Sensitive.
Nerozlišují se malá a velká písmena
A zde je vyhledávání bez rozlišení velkých a malých písmen:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
Výsledek:
11
Nerozlišují se malá a velká písmena, protože _CI
znamená Case-Insensitive.
Funkce PATINDEX()
PATINDEX()
funkce dělá podobnou práci jako CHARINDEX()
. V podstatě máte na výběr, který z nich použijete. Hlavní rozdíl je v syntaxi.
PATINDEX()
syntaxe funkce 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ý se má prohledávat (obvykle sloupec).
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.
Příklady
Zde je příklad:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
Výsledek:
12
Když však nezahrneme zástupné znaky, stane se toto:
SELECT PATINDEX('eer', 'Bob likes beer.');
Výsledek:
0
Zde je další příklad, kde zavádíme další zástupný znak:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Výsledek:
11
V tomto případě podtržítko (_
), což je zástupný znak pro jakýkoli jednotlivý znak.