Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como extrair dois dígitos consecutivos de um campo de texto no MySQL?


Se você quiser mais poder de expressão regular em seu banco de dados, considere usar LIB_MYSQLUDF_PREG . Esta é uma biblioteca de código aberto de funções de usuário do MySQL que importa a biblioteca PCRE. LIB_MYSQLUDF_PREG é entregue apenas na forma de código-fonte. Para usá-lo, você precisará compilá-lo e instalá-lo em seu servidor MySQL. A instalação desta biblioteca não altera o suporte regex integrado do MySQL de forma alguma. Ele apenas disponibiliza as seguintes funções adicionais:

PREG_CAPTURE extrai uma correspondência de regex de uma string. PREG_POSITION retorna a posição na qual uma expressão regular corresponde a uma string. PREG_REPLACE executa uma pesquisa e substituição em uma string. PREG_RLIKE testa se um regex corresponde a uma string.

Todas essas funções usam uma expressão regular como seu primeiro parâmetro. Essa expressão regular deve ser formatada como um operador de expressão regular Perl. Por exemplo. para testar se regex corresponde ao assunto de forma insensível, você usaria o código MySQL PREG_RLIKE('/regex/i', subject). Isso é semelhante às funções preg do PHP, que também requerem delimitadores // extras para expressões regulares dentro da string PHP.

Se você quiser algo mais simples, poderá alterar essa função para atender melhor às suas necessidades.
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