sql >> Databasteknik >  >> RDS >> Mysql

3 sätt att upptäcka om en sträng matchar ett reguljärt uttryck i MySQL

MySQL har ett antal funktioner och operatorer som gör att vi kan utföra operationer med hjälp av reguljära uttryck (regex). Den här artikeln presenterar två operatorer och en funktion som gör att vi kan ta reda på om en sträng matchar ett reguljärt uttryck som specificeras av ett givet mönster.

Dessa regex-funktioner och operatorer är:

  • REGEXP_LIKE()
  • REGEXP
  • RLIKE

Dessa är alla i princip likvärdiga, eftersom operatorerna (de två andra) båda är synonymer till funktionen (den första). I vilket fall som helst kan du se exempel på alla tre i aktion nedan.

REGEXP_LIKE() Funktion

Låt oss först titta på funktionen. Här är ett exempel på hur du kör en regex-sökning med REGEXP_LIKE() funktion:

SELECT 
  REGEXP_LIKE('Car', '^C') AS 'Match',
  REGEXP_LIKE('Bar', '^C') AS 'No Match';

Resultat:

+-------+----------+
| Match | No Match |
+-------+----------+
|     1 |        0 |
+-------+----------+

Den första strängen matchar (eftersom den börjar med C ) så resultatet är 1 . Den andra strängen matchar inte, så resultatet är 0 .

Den här funktionen kan dock vara mycket mer användbar än att bara returnera en 1 eller 0 . Till exempel kan den läggas till i WHERE klausul när du frågar efter en databas. I det här fallet kan vi få en lista med rader som innehåller en matchning för mönstret.

Här är ett exempel:

SELECT AlbumId, AlbumName
FROM Albums
WHERE REGEXP_LIKE(AlbumName, '^Power');

Resultat:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|       1 | Powerslave |
|       2 | Powerage   |
+---------+------------+

Här är hela tabellen:

SELECT AlbumId, AlbumName
FROM Albums;

Resultat:

+---------+--------------------------+
| AlbumId | AlbumName                |
+---------+--------------------------+
|       1 | Powerslave               |
|       2 | Powerage                 |
|       3 | Singing Down the Lane    |
|       4 | Ziltoid the Omniscient   |
|       5 | Casualties of Cool       |
|       6 | Epicloud                 |
|       7 | Somewhere in Time        |
|       8 | Piece of Mind            |
|       9 | Killers                  |
|      10 | No Prayer for the Dying  |
|      11 | No Sound Without Silence |
|      12 | Big Swing Face           |
|      13 | Blue Night               |
|      14 | Eternity                 |
|      15 | Scandinavia              |
|      16 | Long Lost Suitcase       |
|      17 | Praise and Blame         |
|      18 | Along Came Jones         |
|      19 | All Night Wrong          |
|      20 | The Sixteen Men of Tain  |
+---------+--------------------------+

REGEXP Operatör

Så här gör du samma sak med REGEXP operatör:

SELECT 
  'Car' REGEXP '^C' AS 'Match',
  'Bar' REGEXP '^C' AS 'No Match';

Resultat:

+-------+----------+
| Match | No Match |
+-------+----------+
|     1 |        0 |
+-------+----------+

Och databasexemplet:

SELECT AlbumId, AlbumName
FROM Albums
WHERE AlbumName REGEXP '^Power';

Resultat:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|       1 | Powerslave |
|       2 | Powerage   |
+---------+------------+

Du kan också använda NOT REGEXP för att returnera det motsatta resultatet.

RLIKE Operatör

Och här använder den RLIKE :

SELECT 
  'Car' RLIKE '^C' AS 'Match',
  'Bar' RLIKE '^C' AS 'No Match';

Resultat:

+-------+----------+
| Match | No Match |
+-------+----------+
|     1 |        0 |
+-------+----------+

Och databasexemplet:

SELECT AlbumId, AlbumName
FROM Albums
WHERE AlbumName RLIKE '^Power';

Resultat:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|       1 | Powerslave |
|       2 | Powerage   |
+---------+------------+

I det här fallet bytte jag helt enkelt REGEXP för RLIKE och lämnade resten av koden ifred.

Du kan också använda NOT RLIKE för att returnera det motsatta resultatet.

Fler REGEX-funktioner

MySQL innehåller också några andra regex-funktioner och operatorer. Tre av dessa listas nedan. Tekniskt sett kan du också använda de två första för att "upptäcka" om en sträng matchar ett regexmönster (i vilket fall kanske den här artikeln borde ha titeln "5 sätt att upptäcka om en sträng matchar ett reguljärt uttryck i MySQL" istället för bara " 3 sätt...").

Hur som helst, här är ytterligare tre regex-funktioner:

  • Du kan använda REGEXP_INSTR() funktion för att returnera startindexet för en delsträng som matchar det reguljära uttrycksmönstret.
  • REGEXP_SUBSTR() funktion returnerar delsträngen som matchar det givna reguljära uttrycksmönstret.
  • Och REGEXP_REPLACE() funktion ersätter förekomster av delsträngen i en sträng som matchar det givna reguljära uttrycksmönstret.

  1. Ta bort alla poster utom den senaste?

  2. 12 vanliga SQL-operatorer

  3. Hur COS() fungerar i MariaDB

  4. Uppdatera rader i en tabell med data från en annan tabell baserat på att en kolumn i varje är lika