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

Er der en måde at udtrække tekst, der matcher et regulært udtryk, fra en kolonne i MySQL?

Dette er ikke muligt med mysql regex-funktioner (medmindre du installerer nogle udf'er, som ser ud til at være designet til det). Teknisk set, da [0-9] er et begrænset sæt, kan du kaste 10 LOCATE 's i LEAST (pas på &invaliddate 0), og brug SUBSTRING . Ikke et kønt billede:

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

Hvis du bruger det se på udf's. Ellers er du bare bedre til at hente feltet og manipulere det uden for MySQL.

Rediger:hvis tallet passer ind i et heltal , beskidt hackeri kan resultere i:

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


  1. foreach %dopar% + RPostgreSQL

  2. Sådan rettes Security Advisor MySQL Alert

  3. Sådan opgraderes PostgreSQL 11 til PostgreSQL 12 med nul nedetid

  4. hvordan man tildeler cte-værdi til variabel