sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fungerer PATINDEX()-funktionen i SQL Server (T-SQL)

I SQL Server kan du bruge T-SQL PATINDEX() funktion til at finde et mønster i en streng. Specifikt returnerer funktionen kun den første forekomst af mønsteret i strengen.

Funktionen accepterer to argumenter; mønsteret og snoren.

Du kan bruge jokertegn i mønsteret.

Syntaks

Syntaksen ser sådan ud:

PATINDEX ( '%pattern%' , expression )

Hvor mønster er et tegnudtryk, der indeholder den sekvens, der skal findes, og udtryk er det udtryk, der skal søges i.

Eksempel 1 – Grundlæggende brug

Her er et eksempel på, hvordan det virker:

SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 12       |
+----------+

Procenttegnet (% ) er et jokertegn, der repræsenterer enhver streng med nul eller flere tegn.

Eksempel 2 – Ingen match

Her er, hvad der sker, når vi ikke inkluderer jokertegnene:

SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 0        |
+----------+

Selvom den fulde streng matcher mønsteret uden jokertegn, får du et match:

SELECT PATINDEX('Bob', 'Bob') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Du får dog ikke et match, hvis strengen indeholder flere tegn:

SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 0        |
+----------+

I så fald kan du bruge et enkelt jokertegn:

SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Du kan også bruge et enkelt jokertegn et sted i midten af ​​mønsteret:

SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 1        |
+----------+

I dette tilfælde fik vi et match, fordi starten og slutningen af ​​strengen matchede starten og slutningen af ​​mønsteret. Midten af ​​strengen matchede selvfølgelig også midten af ​​mønsteret, fordi alle andre tegn er dækket af procenttegnet.

Eksempel 3 – Underscore-jokertegnet

Her er et andet eksempel, hvor vi introducerer et andet jokertegn:

SELECT PATINDEX('B_er', 'Beer') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Understregningen (_ ), som er et jokertegn for et enkelt tegn. Derfor vil det kun matche, hvis der er præcis ét tegn på den position.

Selvfølgelig kunne ovenstående mønster matche mange forskellige strenge. For eksempel:

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';

Resultat:

+--------+--------+--------+--------+
| Beer   | Bier   | Baer   | B er   |
|--------+--------+--------+--------|
| 1      | 1      | 1      | 1      |
+--------+--------+--------+--------+

Eksempel 4 – Sammenligning af _ og % Jokertegn

Dette eksempel viser forskellen mellem _ og % jokertegn.

SELECT 
  PATINDEX('B%r', 'Beer') AS '%',
  PATINDEX('B_r', 'Beer') AS '_',
  PATINDEX('B__r', 'Beer') AS '__';

Resultat:

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 1    |
+-----+-----+------+

Understregningen matcher kun, når der er præcis én karakter i den position. For at matche to tegn skal vi bruge to understregninger.

Procenttegnet på den anden side matcher et hvilket som helst antal tegn, inklusive nul, som det ses i følgende eksempel:

SELECT 
  PATINDEX('Bee%r', 'Beer') AS '%',
  PATINDEX('Bee_r', 'Beer') AS '_',
  PATINDEX('Bee__r', 'Beer') AS '__';

Resultat:

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 0    |
+-----+-----+------+

Eksempel 5 – Et databaseeksempel

Her er et eksempel på brug af denne funktion i en databaseforespørgsel:

USE Music;
SELECT 
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums
WHERE PATINDEX('%the%', AlbumName) > 0;

Resultat:

+-------------------------+-----------------+
| AlbumName               | Pattern Index   |
|-------------------------+-----------------|
| Singing Down the Lane   | 14              |
| Ziltoid the Omniscient  | 9               |
| No Prayer for the Dying | 15              |
| The Sixteen Men of Tain | 1               |
+-------------------------+-----------------+

I dette tilfælde bruger jeg WHERE klausul for kun at returnere de album, der faktisk matcher, sammen med deres PATINDEX() resultat. Hvis jeg tabte WHERE klausul, ville alle albums være blevet returneret, uanset om de matchede eller ej.

For dem, der ikke matchede, PATINDEX() resultatet ville være nul.

USE Music;
SELECT TOP(10)
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums;

Resultat:

+-------------------------+-----------------+
| 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              |
+-------------------------+-----------------+

Eksempel 6 – Kun første forekomst

Som nævnt, PATINDEX() returnerer kun den første forekomst af mønsteret i strengen.

SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;

Resultat:

+----------+
| Result   |
|----------|
| 5        |
+----------+

CHARINDEX() Funktion

T-SQL CHARINDEX() funktion ligner PATINDEX() . Der er dog nogle forskelle mellem de to. Især PATINDEX() accepterer jokertegn, men ikke en startposition. CHARINDEX() på den anden side accepterer en startposition, men ikke jokertegn.


  1. SQL Server JSON_Modify, hvordan opdateres alle?

  2. Opdel kommaseparerede værdier til kolonner i Oracle

  3. Sammenligning af almindelige databaseinfrastrukturmønstre

  4. Hvordan opdeles en streng i PL/SQL?