Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zahlen aus der Mitte einer Zeichenfolge mit unregelmäßigem Format zurückgeben

Dies ist eine nicht triviale Aufgabe in MySQL, es gibt keine eingebaute Funktion zum Zurückgeben einer Übereinstimmung mit regulären Ausdrücken. Aber weil Sie genau 13 Ziffern suchen, könnten Sie so etwas tun (natürlich erweitern Sie dies auf die Anzahl der Stellen, die Sie überprüfen müssen ...

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

Nein, es ist nicht schön. Aber Sie sollten in der Lage sein, dies zu erweitern, um eine Zeichenfolge angemessener Länge effektiv zu "scannen".

HINWEIS:Der reguläre Ausdruck prüft, ob die gesamte 13-stellige Teilzeichenfolge aus genau 13 Zeichen besteht, wobei jedes Zeichen eine Dezimalziffer (0 bis 9) ist.