sql >> データベース >  >> RDS >> Mysql

MySQLのテキストフィールドから2桁の連続した数字を抽出するにはどうすればよいですか?

    データベースでより正規表現能力が必要な場合は、LIB_MYSQLUDF_PREG の使用を検討できます。 。これは、PCREライブラリをインポートするMySQLユーザー関数のオープンソースライブラリです。 LIB_MYSQLUDF_PREGは、ソースコード形式でのみ提供されます。これを使用するには、コンパイルしてMySQLサーバーにインストールできる必要があります。このライブラリをインストールしても、MySQLの組み込み正規表現サポートは変更されません。次の追加機能を利用できるようにするだけです。

    PREG_CAPTURE 文字列から正規表現の一致を抽出します。 PREG_POSITIONは、正規表現が文字列と一致する位置を返します。 PREG_REPLACEは、文字列に対して検索と置換を実行します。 PREG_RLIKEは、正規表現が文字列と一致するかどうかをテストします。

    これらの関数はすべて、最初のパラメーターとして正規表現を取ります。この正規表現は、Perl正規表現演算子のようにフォーマットする必要があります。例えば。正規表現がサブジェクトケースに鈍感に一致するかどうかをテストするには、MySQLコードPREG_RLIKE('/ regex / i'、subject)を使用します。これはPHPのpreg関数に似ており、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. T-SQL条件付き順序

    2. MySQLで行ジェネレータを作成するにはどうすればよいですか?

    3. 結合が存在しないレコードを検索する

    4. MySQL Connector / Jでセミコロンで区切られた複数のクエリを実行できますか?