Mysql
 sql >> Base de données >  >> RDS >> Mysql

renvoie les nombres du milieu d'une chaîne avec un format irrégulier

Il s'agit d'une tâche non triviale dans MySQL, il n'y a pas de fonction intégrée pour renvoyer une correspondance d'expression régulière. Mais parce que vous recherchez exactement 13 chiffres, vous pouvez faire quelque chose comme ça (évidemment étendre cela au nombre de positions que vous devez vérifier...

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

Non, ce n'est pas joli. Mais vous devriez pouvoir étendre cela pour "scanner" efficacement une chaîne de longueur raisonnable.

REMARQUE :L'expression régulière vérifie que l'ensemble de la sous-chaîne de 13 caractères est composé d'exactement 13 caractères, chacun des caractères étant un chiffre décimal (0 à 9).