sql >> Databáze >  >> RDS >> MariaDB

Jak funguje REGEXP_INSTR() v MariaDB

V MariaDB, REGEXP_INSTR() funkce vrací počáteční index podřetězce, který odpovídá vzoru regulárního výrazu.

Index začíná na 1 . Pokud není shoda, výsledek je 0 .

Syntaxe

Syntaxe vypadá takto:

REGEXP_INSTR(subject, pattern)

Kde subject je vstupní řetězec a pattern je vzor regulárního výrazu pro podřetězec.

Všimněte si, že v době psaní tohoto článku byla MariaDB verze REGEXP_INSTR() přijímá méně argumentů než REGEXP_INSTR() MySQL . Verze MySQL vám umožňuje poskytnout argumenty pro počáteční pozici vyhledávání, který výskyt hledat, jaký typ pozice vrátit, stejně jako způsob, jak upřesnit regulární výraz.

Příklad

Zde je základní příklad:

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

Výsledek:

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

V tomto případě existuje shoda a podřetězec začíná na pozici 2.

Žádná shoda

Zde je příklad, kdy neexistuje žádná shoda:

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

Výsledek:

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

Neexistuje žádná shoda, takže výsledek je 0 . Neexistuje žádná shoda, protože jsem zadal, že řetězec musí začínat podřetězcem.

Pojďme to změnit tak, aby to dělalo začněte tímto podřetězcem:

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

Výsledek:

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

Rozlišovat malá a velká písmena

REGEXP_INSTR() funkce se řídí pravidly rozlišování malých a velkých písmen efektivního řazení. Párování se provádí bez rozlišení malých a velkých písmen u porovnávání bez rozlišení malých a velkých písmen a u porovnávání rozlišujících malá a velká písmena a u binárních dat.

Zde je příklad:

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

Výsledek:

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

Moje výchozí řazení nerozlišuje malá a velká písmena. Zbývající dva řetězce byly nuceny používat řazení bez rozlišení malých a velkých písmen, respektive řazení rozlišující malá a velká písmena.

Poskytování BINARY řetězec také rozlišuje velká a malá písmena (viz níže).

Binární řetězce

Ve výchozím nastavení se pozice měří spíše ve znacích než v bajtech. Můžete však přetypovat vícebajtovou znakovou sadu na BINARY pro získání offsetů v bajtech, pokud potřebujete.

Příklad:

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

Výsledek:

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

Symbol autorských práv používá dva bajty, a proto v tomto příkladu dostaneme výsledek 4 při odesílání do BINARY , ve srovnání s 3 které dostaneme jinak.

Ačkoli mějte na paměti, že předávání BINARY řetězec také ovlivňuje citlivost. S BINARY řetězce, velký znak se liší od malého protějšku:

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

Výsledek:

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

Zde jsem hledal malé písmeno c místo velkých písmen a BINARY řetězec se neshodoval.

Nulové argumenty

Předávání null protože jakýkoli argument má za následek null :

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

Výsledek:

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

Špatný počet argumentů

Předání nesprávného počtu argumentů nebo žádné argumenty vede k chybě:

SELECT REGEXP_INSTR('Cat');

Výsledek:

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

  1. CHYBA:Nelze získat přístup k souboru „$libdir/plpython2“ – CHYBA:Nelze získat přístup k souboru „$libdir/plpython3“

  2. Proč jsou skalární funkce SQL Serveru pomalejší?

  3. ClassCastException:java.math.BigInteger nelze přetypovat na java.lang.Long při připojení k MySQL

  4. 12 Doporučené postupy zabezpečení MySQL/MariaDB pro Linux