sql >> Database >  >> RDS >> Mysql

Is er een manier om tekst te extraheren die overeenkomt met een reguliere expressie uit een kolom in MySQL?

Dit is niet mogelijk met mysql regex-mogelijkheden (tenzij u enkele udf's installeert die daarvoor ontworpen lijken te zijn). Technisch gezien, aangezien [0-9] een beperkte set is, zou je 10 LOCATE kunnen gooien 's in LEAST (pas op voor &ongeldigdatum 0), en gebruik SUBSTRING . Geen mooie foto:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,
  LEAST(
    IF(LOCATE(0,@var)=0,LENGTH(@var),LOCATE(0,@var)),
    IF(LOCATE(1,@var)=0,LENGTH(@var),LOCATE(1,@var)),
    IF(LOCATE(2,@var)=0,LENGTH(@var),LOCATE(2,@var)),
    IF(LOCATE(3,@var)=0,LENGTH(@var),LOCATE(3,@var)),
    IF(LOCATE(4,@var)=0,LENGTH(@var),LOCATE(4,@var)),
    IF(LOCATE(5,@var)=0,LENGTH(@var),LOCATE(5,@var)),
    IF(LOCATE(6,@var)=0,LENGTH(@var),LOCATE(6,@var)),
    IF(LOCATE(7,@var)=0,LENGTH(@var),LOCATE(7,@var)),
    IF(LOCATE(8,@var)=0,LENGTH(@var),LOCATE(8,@var)),
    IF(LOCATE(9,@var)=0,LENGTH(@var),LOCATE(9,@var))
   ) -1 ) as 'result';
+---------+
| result  |
+---------+
| asjdasd | 
+---------+

Als je nodig het kijkt naar udf's. Anders kun je het veld gewoon beter ophalen en buiten MySQL manipuleren.

Bewerken:als het getal in een geheel getal past , vuile hacking kan resulteren in:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
+---------+
| result  |
+---------+
| asjdasd |
+---------+


  1. Records tussen twee tijdstempels selecteren

  2. Dichtstbijzijnde plaatsen zoeken met behulp van puntgegevenstype en st_distance_sphere in MySQL 8

  3. Stop met SQL Server je vuile werk te laten doen

  4. Hoe MySQL-databases weergeven op een PHP-script?