Mysql
 sql >> Database >  >> RDS >> Mysql

C'è un modo per estrarre il testo corrispondente a un'espressione regolare da una colonna in MySQL?

Questo non è possibile con le funzionalità mysql regex (a meno che non si installino alcuni udf che sembrano essere progettati per quello). Tecnicamente, dato che [0-9] è un set limitato, potresti lanciare 10 LOCATE è in LEAST (attenzione a &invaliddate 0) e usa SUBSTRING . Non è una bella immagine:

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

Se hai necessità guarda gli udf. Altrimenti è solo meglio recuperare il campo e manipolarlo al di fuori di MySQL.

Modifica:se il numero rientra in un numero intero , l'hackeraggio sporco potrebbe comportare :

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