sql >> Databasteknik >  >> RDS >> Mysql

Finns det något sätt att extrahera text som matchar ett reguljärt uttryck från en kolumn i MySQL?

Detta är inte möjligt med mysql regex-funktioner (såvida du inte installerar några udf:er som verkar vara designade för det). Tekniskt sett, eftersom [0-9] är en begränsad uppsättning kan du kasta 10 LOCATE är i LEAST (se upp för &invaliddate 0), och använd SUBSTRING . Ingen vacker bild:

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

Om du behöver det tittar på udf's. Annars är det bara bättre att hämta fältet och manipulera det utanför MySQL.

Redigera:om talet passar i ett heltal , smutsigt hackeri kan resultera i:

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


  1. Hur räknar jag bara den första förekomsten av ett värde?

  2. Fråga efter element av array i JSON-kolumnen

  3. Hur man går med två tabeller i MySQL

  4. Postgres aggregeringsfunktion för beräkning av vektormedelvärde för vindhastighet (vektorstorlek) och vindriktning (vektorriktning)