sql >> Databáze >  >> RDS >> Mysql

vrátí čísla ze středu řetězce s nepravidelným formátem

Toto je netriviální úloha v MySQL, není zde žádná vestavěná funkce pro vrácení shody regulárního výrazu. Ale protože hledáte přesně 13 číslic, můžete udělat něco takového (samozřejmě to rozšířit na počet pozic, které potřebujete zkontrolovat...

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

Ne, není to hezké. Ale měli byste být schopni toto rozšířit, abyste efektivně „naskenovali“ řetězec přiměřené délky.

POZNÁMKA:Regulární výraz kontroluje, zda celý 13znakový podřetězec obsahuje přesně 13 znaků, přičemž každý ze znaků je dekadická číslice (0 až 9).



  1. connection.select_value vrací řetězce pouze v postgresu s pg gem

  2. MYSQL extrahuje prvky json, kde json obsahuje

  3. Mohu psát funkce PostgreSQL na Ruby on Rails?

  4. MYSQL JOIN na více tabulkách nevrací žádné výsledky