Mysql
 sql >> Base de données >  >> RDS >> Mysql

Existe-t-il un moyen d'extraire le texte correspondant à une expression régulière d'une colonne dans MySQL ?

Ce n'est pas possible avec les capacités de mysql regex (à moins d'installer des udf qui semblent être conçus pour cela). Techniquement, comme [0-9] est un ensemble limité, vous pouvez lancer 10 LOCATE est dans LEAST (attention à la date d'invalidation 0) et utilisez SUBSTRING . Pas une belle image :

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

Si vous avez besoin il regarde UDF. Sinon, vous feriez mieux de récupérer le champ et de le manipuler en dehors de MySQL.

Modifier :si le nombre tient dans un entier , le piratage sale pourrait entraîner :

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