V SQL Server můžete použít buď CHARINDEX()
nebo PATINDEX()
funkce k nalezení řetězce v řetězci. Toto jsou funkce řetězce Transact-SQL a jsou k dispozici také v databázích Azure.
Na první pohled se zdá, že tyto funkce dělají přesně to samé a v mnoha případech můžete použít kteroukoli, kterou chcete použít.
Existuje však několik rozdílů, které by mohly určovat, kterou funkci se v určitých scénářích rozhodnete použít. Ty lze shrnout takto:
PATINDEX()
umožňuje používat zástupné znaky k vyhledávání vzorů.CHARINDEX()
ne.CHARINDEX()
přijímá třetí argument, který vám umožňuje určit počáteční pozici vyhledávání.PATINDEX()
ne.
Více podrobností o těchto bodech níže.
Definice
Nejprve se podívejme na oficiální definici nebo jednotlivé funkce.
CHARINDEX()
- Hledá jeden znakový výraz uvnitř druhého znakového výrazu a v případě nalezení vrátí počáteční pozici prvního výrazu.
PATINDEX()
- Vrátí počáteční pozici prvního výskytu vzoru v zadaném výrazu nebo nuly, pokud vzor nebyl nalezen, u všech platných textových a znakových datových typů.
Syntaxe
A zde je oficiální syntaxe každé funkce.
CHARINDEX()
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
PATINDEX()
PATINDEX ( '%pattern%' , expression )
Obě funkce vám tedy umožňují hledat znakový výraz, nicméně PATINDEX()
funkce umožňuje vyhledávat vzor . Jedná se tedy o další funkce, které s CHARINDEX()
nezískáte funkce. Pomocí PATINDEX()
můžete použít zástupné znaky k určení vzoru pro vyhledávání, což může být v některých situacích velmi užitečné.
Nicméně CHARINDEX()
přijímá tři argumenty, zatímco PATINDEX()
přijímá pouze dva. CHARINDEX()
funkce přijímá volitelný třetí argument, který vám umožňuje určit počáteční pozici vyhledávání. Jinými slovy, CHARINDEX()
funkce umožňuje vrátit pouze ty shody, které se vyskytnou po určitém bodě v řetězci.
Příklady
Zde jsou příklady, které demonstrují další funkce poskytované každou funkcí.
CHARINDEX()
Zde uvádím třetí argument pro určení pozice pro zahájení vyhledávání. V tomto případě přeskočí první výskyt Bob
a vrátí pozici druhého výskytu.
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Výsledek:
17
Jak již bylo zmíněno, nemůžete to udělat pomocí PATINDEX()
protože nepřijímá tento třetí parametr.
PATINDEX()
Nyní je zde příklad toho, co můžete dělat pomocí PATINDEX()
které nemůžete udělat s CHARINDEX()
. V tomto příkladu používáme zástupné znaky k hledání vzoru:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Výsledek:
11
V tomto případě používáme znaky procent (%
), což jsou zástupné znaky označující, že libovolný počet znaků může pokračovat a uspět v našem vyhledávacím řetězci. Používáme také podtržítko (_
), což je zástupný znak pro jednotlivé postava.
Závěr
Takže zatímco oba CHARINDEX()
a PATINDEX()
poskytují podobné funkce a v mnoha případech lze použít jednu místo druhé. Někdy je potřeba použít jednu přes druhou.
Konkrétně byste použili CHARINDEX()
když chcete zadat počáteční pozici v řetězci pro vyhledávání. A použili byste PATINDEX()
kdykoli potřebujete zadat vzor, který chcete hledat.