sql >> Base de Datos >  >> RDS >> Mysql

¿Hay alguna forma de extraer texto que coincida con una expresión regular de una columna en MySQL?

Esto no es posible con las capacidades de mysql regex (a menos que instale algunos udf que parecen estar diseñados para eso). Técnicamente, como [0-9] es un conjunto limitado, podría arrojar 10 LOCATE 's en LEAST (cuidado con &invalidate 0), y usa SUBSTRING . No es una imagen bonita:

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 necesitas mira udf's. De lo contrario, es mejor buscar el campo y manipularlo fuera de MySQL.

Editar:si el número cabe en un número entero , la piratería sucia podría resultar en:

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