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

Jak wyodrębnić dwie kolejne cyfry z pola tekstowego w MySQL?

Jeśli potrzebujesz większej mocy wyrażeń regularnych w swojej bazie danych, możesz rozważyć użycie LIB_MYSQLUDF_PREG . Jest to biblioteka open source funkcji użytkownika MySQL, która importuje bibliotekę PCRE. LIB_MYSQLUDF_PREG jest dostarczany tylko w postaci kodu źródłowego. Aby z niego skorzystać, musisz być w stanie go skompilować i zainstalować na swoim serwerze MySQL. Zainstalowanie tej biblioteki w żaden sposób nie zmienia wbudowanej obsługi wyrażeń regularnych MySQL. Udostępnia jedynie następujące dodatkowe funkcje:

PREG_CAPTURE wyodrębnia z łańcucha dopasowanie wyrażenia regularnego. PREG_POSITION zwraca pozycję, w której wyrażenie regularne pasuje do ciągu. PREG_REPLACE wykonuje wyszukiwanie i zamienianie na łańcuchu. PREG_RLIKE sprawdza, czy wyrażenie regularne pasuje do ciągu.

Wszystkie te funkcje przyjmują jako pierwszy parametr wyrażenie regularne. To wyrażenie regularne musi być sformatowane jak operator wyrażenia regularnego Perla. Np. aby sprawdzić, czy wyrażenie regularne pasuje niewrażliwie do tematu, użyj kodu MySQL PREG_RLIKE('/regex/i', temat). Jest to podobne do funkcji preg PHP, które również wymagają dodatkowych ograniczników // dla wyrażeń regularnych wewnątrz ciągu PHP.

Jeśli chcesz czegoś prostszego, możesz zmienić tę funkcję, aby lepiej odpowiadała Twoim potrzebom.

CREATE FUNCTION REGEXP_EXTRACT(string TEXT, exp TEXT)
-- Extract the first longest string that matches the regular expression
-- If the string is 'ABCD', check all strings and see what matches: 'ABCD', 'ABC', 'AB', 'A', 'BCD', 'BC', 'B', 'CD', 'C', 'D'
-- It's not smart enough to handle things like (A)|(BCD) correctly in that it will return the whole string, not just the matching token.

RETURNS TEXT
DETERMINISTIC
BEGIN
  DECLARE s INT DEFAULT 1;
  DECLARE e INT;
  DECLARE adjustStart TINYINT DEFAULT 1;
  DECLARE adjustEnd TINYINT DEFAULT 1;

  -- Because REGEXP matches anywhere in the string, and we only want the part that matches, adjust the expression to add '^' and '$'
  -- Of course, if those are already there, don't add them, but change the method of extraction accordingly.

  IF LEFT(exp, 1) = '^' THEN 
    SET adjustStart = 0;
  ELSE
    SET exp = CONCAT('^', exp);
  END IF;

  IF RIGHT(exp, 1) = '$' THEN
    SET adjustEnd = 0;
  ELSE
    SET exp = CONCAT(exp, '$');
  END IF;

  -- Loop through the string, moving the end pointer back towards the start pointer, then advance the start pointer and repeat
  -- Bail out of the loops early if the original expression started with '^' or ended with '$', since that means the pointers can't move
  WHILE (s <= LENGTH(string)) DO
    SET e = LENGTH(string);
    WHILE (e >= s) DO
      IF SUBSTRING(string, s, e) REGEXP exp THEN
        RETURN SUBSTRING(string, s, e);
      END IF;
      IF adjustEnd THEN
        SET e = e - 1;
      ELSE
        SET e = s - 1; -- ugh, such a hack to end it early
      END IF;
    END WHILE;
    IF adjustStart THEN
      SET s = s + 1;
    ELSE
      SET s = LENGTH(string) + 1; -- ugh, such a hack to end it early
    END IF;
  END WHILE;

  RETURN NULL;

END


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać rekordy między 2 datami w MySQL?

  2. MAX() – Znajdź maksymalną wartość w kolumnie w MySQL

  3. Ukrywanie prawdziwego identyfikatora obiektu bazy danych w adresach URL

  4. Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/var/lib/mysql/mysql.sock' (2)

  5. Zapomniane hasło root do mysql