sql >> Database teknologi >  >> RDS >> Mysql

Hvordan udtrækkes to på hinanden følgende cifre fra et tekstfelt i MySQL?

Hvis du ønsker mere regulært udtrykskraft i din database, kan du overveje at bruge LIB_MYSQLUDF_PREG . Dette er et open source-bibliotek med MySQL-brugerfunktioner, der importerer PCRE-biblioteket. LIB_MYSQLUDF_PREG leveres kun i kildekodeform. For at bruge det, skal du være i stand til at kompilere det og installere det på din MySQL-server. Installation af dette bibliotek ændrer ikke MySQL's indbyggede regex-understøttelse på nogen måde. Det gør blot følgende ekstra funktioner tilgængelige:

PREG_CAPTURE udtrækker et regex-match fra en streng. PREG_POSITION returnerer den position, hvor et regulært udtryk matcher en streng. PREG_REPLACE udfører en søg-og-erstat på en streng. PREG_RLIKE tester, om et regex matcher en streng.

Alle disse funktioner tager et regulært udtryk som deres første parameter. Dette regulære udtryk skal formateres som en Perl regulært udtryksoperator. For eksempel. for at teste, om regex matcher emnet ufølsomt, ville du bruge MySQL-koden PREG_RLIKE('/regex/i', subject). Dette ligner PHP's preg-funktioner, som også kræver de ekstra //-afgrænsningstegn for regulære udtryk inde i PHP-strengen.

Hvis du vil have noget mere enkelt, kan du ændre denne funktion, så den passer bedre til dine behov.

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. Hvordan clock_timestamp() virker i PostgreSQL

  2. SQL Server 2008-support slutter. Hvad nu?

  3. Sådan importeres en PostgreSQL-database ved hjælp af phpPgAdmin

  4. JPA Tabelnavne med store bogstaver