sql >> Databáze >  >> RDS >> Sqlserver

Jak najít řetězec v řetězci na serveru SQL

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.


  1. VLOŽTE ... NA DUPLIKÁTNÍ KLÍČ (nedělat nic)

  2. Jak důležité je pořadí sloupců v indexech?

  3. ORA-00918:sloupec nejednoznačně definovaný v SELECT *

  4. datetime2 vs smalldatetime v SQL Server:Jaký je rozdíl?