sql >> Database >  >> RDS >> Sqlserver

Hoe de PATINDEX()-functie werkt in SQL Server (T-SQL)

In SQL Server kunt u de T-SQL PATINDEX() . gebruiken functie om een ​​patroon binnen een string te vinden. In het bijzonder retourneert de functie alleen de eerste voorkomen van het patroon binnen de string.

De functie accepteert twee argumenten; het patroon en de string.

U kunt binnen het patroon jokertekens gebruiken.

Syntaxis

De syntaxis gaat als volgt:

PATINDEX ( '%pattern%' , expression )

Waar patroon is een tekenuitdrukking die de te vinden reeks bevat, en uitdrukking is de uitdrukking waarnaar moet worden gezocht.

Voorbeeld 1 – Basisgebruik

Hier is een voorbeeld van hoe het werkt:

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

Resultaat:

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

Het procentteken (% ) is een jokerteken dat een reeks van nul of meer tekens vertegenwoordigt.

Voorbeeld 2 – Geen overeenkomst

Dit is wat er gebeurt als we de jokertekens niet opnemen:

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

Resultaat:

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

Hoewel, als de volledige tekenreeks overeenkomt met het patroon zonder jokertekens, je een overeenkomst krijgt:

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

Resultaat:

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

U krijgt echter geen overeenkomst als de tekenreeks meer tekens bevat:

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

Resultaat:

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

In dat geval zou u een enkel jokerteken kunnen gebruiken:

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

Resultaat:

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

Je zou ook een enkele joker ergens in het midden van het patroon kunnen gebruiken:

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

Resultaat:

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

In dit geval kregen we een match omdat het begin en einde van de string overeenkwam met het begin en einde van het patroon. Natuurlijk kwam het midden van de tekenreeks ook overeen met het midden van het patroon, omdat alle andere tekens worden gedekt door het procentteken.

Voorbeeld 3 – Het underscore-jokerteken

Hier is nog een voorbeeld waarin we een ander jokerteken introduceren:

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

Resultaat:

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

Het onderstrepingsteken (_ ) wat een jokerteken is voor elk afzonderlijk teken. Daarom komt het alleen overeen als er precies één teken op die positie staat.

Natuurlijk kan het bovenstaande patroon overeenkomen met veel verschillende snaren. Bijvoorbeeld:

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

Resultaat:

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

Voorbeeld 4 – Vergelijking van de _ en % Jokertekens

Dit voorbeeld demonstreert het verschil tussen de _ en % jokertekens.

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

Resultaat:

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

Het onderstrepingsteken komt alleen overeen als er precies één teken op die positie staat. Om twee tekens te matchen, moeten we twee onderstrepingstekens gebruiken.

Het procentteken daarentegen komt overeen met een willekeurig aantal tekens, inclusief nul, zoals te zien is in het volgende voorbeeld:

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

Resultaat:

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

Voorbeeld 5 – Een databasevoorbeeld

Hier is een voorbeeld van het gebruik van deze functie in een databasequery:

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

Resultaat:

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

In dit geval gebruik ik de WHERE clausule om alleen die albums terug te geven die daadwerkelijk overeenkomen, samen met hun PATINDEX() resultaat. Als ik de WHERE . laat vallen clausule, zouden alle albums zijn geretourneerd, ongeacht of ze overeenkwamen of niet.

Voor degenen die niet overeenkwamen, de PATINDEX() resultaat zou nul zijn.

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

Resultaat:

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

Voorbeeld 6 – Alleen eerste keer

Zoals vermeld, PATINDEX() geeft alleen de eerste . terug voorkomen van het patroon binnen de string.

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

Resultaat:

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

De CHARINDEX() Functie

De T-SQL CHARINDEX() functie is vergelijkbaar met PATINDEX() . Er zijn echter enkele verschillen tussen de twee. In het bijzonder de PATINDEX() accepteert jokertekens, maar geen startpositie. CHARINDEX() aan de andere kant accepteert een startpositie, maar geen jokertekens.


  1. Oracle invoegen als rij niet bestaat

  2. SQL Join op null-waarden

  3. Docker PGMASTER PostgreSQL-versie-update

  4. Zijn geneste transacties toegestaan ​​in MySQL?