sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo extraer dos dígitos consecutivos de un campo de texto en MySQL?

Si desea más poder de expresión regular en su base de datos, puede considerar usar LIB_MYSQLUDF_PREG . Esta es una biblioteca de código abierto de funciones de usuario de MySQL que importa la biblioteca PCRE. LIB_MYSQLUDF_PREG se entrega solo en forma de código fuente. Para usarlo, deberá poder compilarlo e instalarlo en su servidor MySQL. La instalación de esta biblioteca no cambia el soporte de expresiones regulares incorporado de MySQL de ninguna manera. Simplemente pone a disposición las siguientes funciones adicionales:

PREG_CAPTURE extrae una coincidencia de expresiones regulares de una cadena. PREG_POSITION devuelve la posición en la que una expresión regular coincide con una cadena. PREG_REPLACE realiza una búsqueda y reemplazo en una cadena. PREG_RLIKE comprueba si una expresión regular coincide con una cadena.

Todas estas funciones toman una expresión regular como primer parámetro. Esta expresión regular debe tener el formato de un operador de expresión regular de Perl. P.ej. para probar si la expresión regular coincide con el caso del asunto de manera insensible, usaría el código MySQL PREG_RLIKE('/regex/i', asunto). Esto es similar a las funciones preg de PHP, que también requieren delimitadores // adicionales para expresiones regulares dentro de la cadena de PHP.

Si desea algo más simple, puede modificar esta función para que se adapte mejor a sus necesidades.

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