sql >> Databáze >  >> RDS >> Mysql

Jak extrahovat dvě po sobě jdoucí číslice z textového pole v MySQL?

Pokud chcete ve své databázi více výkonu regulárních výrazů, můžete zvážit použití LIB_MYSQLUDF_PREG . Toto je open source knihovna uživatelských funkcí MySQL, která importuje knihovnu PCRE. LIB_MYSQLUDF_PREG je dodáván pouze ve formě zdrojového kódu. Abyste jej mohli používat, musíte být schopni jej zkompilovat a nainstalovat na váš MySQL server. Instalace této knihovny žádným způsobem nezmění vestavěnou podporu regulárních výrazů MySQL. Pouze zpřístupňuje následující doplňkové funkce:

PREG_CAPTURE extrahuje shodu regulárního výrazu z řetězce. PREG_POSITION vrací pozici, na které se regulární výraz shoduje s řetězcem. PREG_REPLACE provádí vyhledávání a nahrazování v řetězci. PREG_RLIKE testuje, zda se regulární výraz shoduje s řetězcem.

Všechny tyto funkce berou jako svůj první parametr regulární výraz. Tento regulární výraz musí být naformátován jako operátor regulárního výrazu v Perlu. Např. Chcete-li otestovat, zda se regulární výraz shoduje s předmětem necitlivě, použijete kód MySQL PREG_RLIKE('/regex/i', předmět). Je to podobné funkcím PHP preg, které také vyžadují další // oddělovače pro regulární výrazy v řetězci PHP.

Pokud chcete něco jednoduššího, můžete tuto funkci upravit tak, aby lépe vyhovovala vašim potřebám.

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. Jak odstranit úvodní a/nebo koncové mezery řetězce v T-SQL

  2. Jak zobrazit serverové řazení v MySQL

  3. MySQL Jako více hodnot

  4. Chyba MySql:1364 Pole 'display_name' nemá výchozí hodnotu