Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe uma maneira de extrair texto correspondente a uma expressão regular de uma coluna no MySQL?


Isso não é possível com os recursos do mysql regex (a menos que instale alguns udfs que parecem ser projetados para isso). Tecnicamente, como [0-9] é um conjunto limitado, você pode lançar 10 LOCATE 's em LEAST (cuidado com &invaliddate 0) e use SUBSTRING . Não é uma foto 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 | 
+---------+

Se você precisar olha udf's. Caso contrário, é melhor buscar o campo e manipulá-lo fora do MySQL.

Editar:se o número couber em um inteiro , hackers sujos podem resultar em:
SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
+---------+
| result  |
+---------+
| asjdasd |
+---------+