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

returnere tal fra midten af ​​en streng med uregelmæssigt format

Dette er en ikke-triviel opgave i MySQL, der er ingen indbygget funktion til at returnere et regulært udtryksmatch. Men fordi du leder efter præcis 13 cifre, kunne du gøre sådan noget (selvfølgelig udvide dette til det antal positioner, du skal tjekke...

-- setup test
CREATE TABLE t (foo VARCHAR(30));
INSERT INTO t VALUES 
('1938420985390asdfih')
,('1234812934810dflkasd')
,('asdfasldkjfaasdfjasd')
,('asd;flkjaklsdf')
,('adfsdf1234073927357sdapjfas')
,('1/4sdikhsd')


SELECT CASE
       WHEN SUBSTR(foo,1,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,1,13)
       WHEN SUBSTR(foo,2,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,2,13)
       WHEN SUBSTR(foo,3,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,3,13)
       WHEN SUBSTR(foo,4,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,4,13)
       WHEN SUBSTR(foo,5,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,5,13)
       WHEN SUBSTR(foo,6,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,6,13)
       WHEN SUBSTR(foo,7,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,7,13)
       WHEN SUBSTR(foo,8,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,8,13)
       WHEN SUBSTR(foo,9,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,9,13)
       END AS digits
  FROM t

-------------------
1938420985390
1234812934810
(NULL)
(NULL)
1234073927357
(NULL) 

Nej, det er ikke kønt. Men du burde være i stand til at udvide dette til effektivt at "scanne" en streng af rimelig længde.

BEMÆRK:Det regulære udtryk kontrollerer, at hele understrengen på 13 tegn består af nøjagtigt 13 tegn, hvert af tegnene er et decimaltal (0 til 9).



  1. Hvordan henter man data fra binær logfil og indsætter i vores ønskede tabel i MySQL?

  2. Konverter fil fra Cp1252 til utf -8 java

  3. MySQL-bindingsadresse i en Docker-beholder

  4. verify_queryable_inventory returneret ORA-20008:Timeout