sql >> Databasteknik >  >> RDS >> Mysql

returnera nummer från mitten av en sträng med oregelbundet format

Detta är en icke-trivial uppgift i MySQL, det finns ingen inbyggd funktion för att returnera en matchning med reguljärt uttryck. Men eftersom du letar efter exakt 13 siffror kan du göra något så här (uppenbarligen utöka detta till antalet positioner du behöver kontrollera...

-- 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 är inte snyggt. Men du bör kunna utöka detta för att effektivt "skanna" en sträng av rimlig längd.

OBS:Det reguljära uttrycket kontrollerar att hela delsträngen på 13 tecken består av exakt 13 tecken, vart och ett av tecknen är en decimalsiffra (0 till 9).



  1. GUI-verktyg för PostgreSQL

  2. GeoDjango på Windows:Kunde inte hitta GDAL-biblioteket / OSError:[WinError 126] Den angivna modulen kunde inte hittas

  3. Visa resultat från MySQL-fråga i tabeller med PHP

  4. SQL-injektionsattack med php