Mysql
 sql >> Baza danych >  >> RDS >> Mysql

zwracaj liczby ze środka ciągu o nieregularnym formacie

Jest to nietrywialne zadanie w MySQL, nie ma wbudowanej funkcji do zwracania dopasowania wyrażenia regularnego. Ale ponieważ szukasz dokładnie 13 cyfr, możesz zrobić coś takiego (oczywiście rozszerz to do liczby pozycji, które musisz sprawdzić...

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

Nie, to nie jest ładne. Ale powinieneś być w stanie to rozszerzyć, aby skutecznie „zeskanować” ciąg o rozsądnej długości.

UWAGA:Wyrażenie regularne sprawdza, czy cały 13-znakowy podciąg składa się dokładnie z 13 znaków, każdy ze znaków jest cyfrą dziesiętną (0 do 9).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - AKTUALIZACJA wiersza na podstawie innych wierszy

  2. Indeks MySQL dla MIN i MAX

  3. Jaki jest dobry sposób na hermetyzację dostępu do danych za pomocą PHP/MySQL?

  4. MySQL - policz całkowitą liczbę wierszy w php

  5. Jak mogę napisać funkcję zdefiniowaną przez użytkownika w MySQL, aby po usunięciu wiersza z jednej tabeli ten konkretny wiersz z innej tabeli również został usunięty?