Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да извлека две последователни цифри от текстово поле в MySQL?

Ако искате повече мощност на регулярните изрази във вашата база данни, можете да помислите за използването на LIB_MYSQLUDF_PREG . Това е библиотека с отворен код от потребителски функции на MySQL, която импортира библиотеката PCRE. LIB_MYSQLUDF_PREG се доставя само под формата на изходен код. За да го използвате, ще трябва да можете да го компилирате и инсталирате във вашия MySQL сървър. Инсталирането на тази библиотека не променя по никакъв начин вградената поддръжка на регулярни изрази на MySQL. Той просто прави достъпни следните допълнителни функции:

PREG_CAPTURE извлича съвпадение на регулярен израз от низ. PREG_POSITION връща позицията, в която регулярен израз съответства на низ. PREG_REPLACE извършва търсене и замяна на низ. PREG_RLIKE тества дали регулярен израз съвпада с низ.

Всички тези функции приемат регулярен израз като първи параметър. Този регулярен израз трябва да бъде форматиран като оператор на регулярен израз на Perl. напр. за да проверите дали регулярният израз съвпада безчувствено към главния и главния букви на темата, трябва да използвате кода на MySQL PREG_RLIKE('/regex/i', subject). Това е подобно на функциите preg на PHP, които също изискват допълнителни // разделители за регулярни изрази в PHP низа.

Ако искате нещо по-просто, можете да промените тази функция, за да отговаря по-добре на вашите нужди.

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. mysql_fetch_array() очаква параметър 1 да бъде проблем с ресурсите

  2. Стойността на часовата зона на сървъра „AEST“ е неразпозната или представлява повече от една часова зона

  3. Как да нулирате паролата на администратор на WordPress чрез командния ред на MySQL

  4. #1139 - Получих грешка „операнд за повторение невалиден“ от регулярния израз

  5. Изчисляване на разстоянието между пощенските кодове в PHP