sql >> Database >  >> RDS >> Mysql

retourneer getallen uit het midden van een tekenreeks met een onregelmatig formaat

Dit is een niet-triviale taak in MySQL, er is geen ingebouwde functie voor het retourneren van een reguliere expressieovereenkomst. Maar omdat je precies 13 cijfers zoekt, zou je zoiets kunnen doen (uiteraard uitbreiden tot het aantal posities dat je moet controleren...

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

Nee, het is niet mooi. Maar u zou dit moeten kunnen uitbreiden om een ​​reeks van redelijke lengte effectief te "scannen".

OPMERKING:De reguliere expressie controleert of de hele substring van 13 tekens uit precies 13 tekens bestaat, elk van de tekens is een decimaal cijfer (0 tot en met 9).



  1. Een Excel-spreadsheet maken vanuit een Oracle-database

  2. Hoe krijg ik enkele kolomwaarden met MySQLi?

  3. Voeg unieke reeksen van 8 willekeurige tekens in

  4. Een database herstellen vanuit C#