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

Jak funguje funkce PATINDEX() v SQL Server (T-SQL)

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.


  1. Zvýraznění přístupů ve fulltextovém vyhledávání

  2. Jak migrovat databáze a datové soubory

  3. JSON_STORAGE_SIZE() – Najděte velikost úložiště dokumentu JSON v MySQL

  4. Typ přetypování řetězce na celé číslo