sql >> Database >  >> RDS >> MariaDB

Hoe REGEXP_INSTR() werkt in MariaDB

In MariaDB, de REGEXP_INSTR() functie retourneert de startindex van een subtekenreeks die overeenkomt met het patroon van de reguliere expressie.

De index begint bij 1 . Als er geen overeenkomst is, is het resultaat 0 .

Syntaxis

De syntaxis gaat als volgt:

REGEXP_INSTR(subject, pattern)

Waar subject is de invoerreeks en pattern is het reguliere expressiepatroon voor de subtekenreeks.

Merk op dat, op het moment van schrijven, MariaDB's versie van REGEXP_INSTR() accepteert minder argumenten dan MySQL's REGEXP_INSTR() . Met de versie van MySQL kunt u argumenten opgeven voor de startpositie van de zoekopdracht, naar welke gebeurtenis moet worden gezocht, welk type positie moet worden geretourneerd, evenals een manier om de reguliere expressie te verfijnen.

Voorbeeld

Hier is een eenvoudig voorbeeld:

SELECT REGEXP_INSTR('Cat', 'at');

Resultaat:

+---------------------------+
| REGEXP_INSTR('Cat', 'at') |
+---------------------------+
|                         2 |
+---------------------------+

In dit geval is er een match en begint de substring op positie 2.

Geen overeenkomst

Hier is een voorbeeld waarbij er geen overeenkomst is:

SELECT REGEXP_INSTR('Cat', '^at');

Resultaat:

+----------------------------+
| REGEXP_INSTR('Cat', '^at') |
+----------------------------+
|                          0 |
+----------------------------+

Er is geen overeenkomst, dus het resultaat is 0 . Er is geen overeenkomst omdat ik heb opgegeven dat de tekenreeks moet beginnen met de subtekenreeks.

Laten we het veranderen zodat het doet begin met die substring:

SELECT REGEXP_INSTR('at', '^at');

Resultaat:

+---------------------------+
| REGEXP_INSTR('at', '^at') |
+---------------------------+
|                         1 |
+---------------------------+

Hoofdlettergevoeligheid

De REGEXP_INSTR() functie volgt de hoofdlettergevoeligheidsregels van de effectieve sortering. Het matchen wordt hoofdletterongevoelig uitgevoerd voor hoofdletterongevoelige sorteringen en hoofdlettergevoelig voor hoofdlettergevoelige sorteringen en voor binaire gegevens.

Hier is een voorbeeld:

SELECT 
    REGEXP_INSTR('Cat', 'c') AS "My Default",
    REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
    REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";

Resultaat:

+------------+------------------+----------------+
| My Default | Case Insensitive | Case Sensitive |
+------------+------------------+----------------+
|          1 |                1 |              0 |
+------------+------------------+----------------+

Mijn standaardsortering is niet hoofdlettergevoelig. De andere twee strings werden gedwongen om respectievelijk hoofdlettergevoelig en hoofdlettergevoelig te sorteren.

Het verstrekken van een BINARY string is ook hoofdlettergevoelig (zie hieronder).

Binaire strings

Standaard worden de posities gemeten in tekens in plaats van in bytes. U kunt echter een multi-byte tekenset casten naar BINARY om offsets in bytes te krijgen als dat nodig is.

Voorbeeld:

SELECT 
    REGEXP_INSTR('© Cat', 'C') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";

Resultaat:

+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      4 |
+-----------+--------+

Het copyright-symbool gebruikt twee bytes, en daarom krijgen we in dit voorbeeld een resultaat van 4 bij het casten naar BINARY , vergeleken met 3 die we anders krijgen.

Houd er echter rekening mee dat het doorgeven van een BINARY string heeft ook invloed op de hoofdlettergevoeligheid. Met BINARY strings, is een hoofdletter anders dan zijn tegenhanger in kleine letters:

SELECT 
    REGEXP_INSTR('© Cat', 'c') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";

Resultaat:

+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      0 |
+-----------+--------+

Hier zocht ik naar een kleine letter c in plaats van een hoofdletter, en de BINARY tekenreeks kwam niet overeen.

Nullargumenten

Doorgeven van null aangezien elk argument resulteert in null :

SELECT 
    REGEXP_INSTR(null, 'c') AS "1",
    REGEXP_INSTR('Cat', null) AS "2",
    REGEXP_INSTR(null, null) AS "3";

Resultaat:

+------+------+------+
| 1    | 2    | 3    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Onjuist aantal argumenten

Het doorgeven van het verkeerde aantal argumenten of geen argumenten, resulteert in een fout:

SELECT REGEXP_INSTR('Cat');

Resultaat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'

  1. BESTEL OP DATUM met eerst NULLS en vervolgens de meest recente datums

  2. Intermitterende ODBC-verbindingsfouten

  3. PostgreSQL DATEADD() Equivalent

  4. Een Amazon Aurora-cluster maken