28

MySQL データベースがあり、次のようなクエリがあります。

SELECT `id`, `originaltext` FROM `source` WHERE `originaltext` regexp '[0-9][0-9]'

これにより、2 桁の数字を含むすべての元のテキストが検出されます。

これらの数値をフィールドとして返すにはMySQLが必要なので、さらに操作できます。

理想的には、20 を超える必要がある追加の基準を追加できれば素晴らしいと思いますが、それを個別に行うこともできます。

4

7 に答える 7

9

MySQL には、正規表現を使用してテキストを抽出するための構文はありません。REGEXP を使用して 2 つの連続する数字を含む行を識別できますが、それらを抽出するには通常の文字列操作関数を使用する必要があり、この場合は非常に困難です。

代替案:

  • データベースから値全体を選択し、クライアントで正規表現を使用します。
  • SQL標準をより適切にサポートする別のデータベースを使用してください(オプションではないかもしれませんが、私は知っています)。次に、これを使用できますSUBSTRING(originaltext from '%#[0-9]{2}#%' for '#')
于 2011-03-19T10:26:21.200 に答える
2

私は自分のコードをストアド プロシージャ (関数) として使用し、1 つのブロック内の数字から構築された任意の数値を抽出するように動作します。これは私のより広いライブラリの一部です。

DELIMITER $$

--  2013.04 michal@glebowski.pl
--  FindNumberInText("ab 234 95 cd", TRUE) => 234  
--  FindNumberInText("ab 234 95 cd", FALSE) => 95

DROP FUNCTION IF EXISTS FindNumberInText$$
CREATE FUNCTION FindNumberInText(_input VARCHAR(64), _fromLeft BOOLEAN) RETURNS VARCHAR(32)
BEGIN
  DECLARE _r              VARCHAR(32) DEFAULT '';
  DECLARE _i              INTEGER DEFAULT 1;
  DECLARE _start          INTEGER DEFAULT 0;
  DECLARE _IsCharNumeric  BOOLEAN;

  IF NOT _fromLeft THEN SET _input = REVERSE(_input); END IF;
  _loop: REPEAT
    SET _IsCharNumeric = LOCATE(MID(_input, _i, 1), "0123456789") > 0;
    IF _IsCharNumeric THEN
      IF _start = 0 THEN SET _start  = _i;  END IF;
    ELSE
      IF _start > 0 THEN LEAVE _loop;       END IF;
    END IF;
    SET _i = _i + 1;
  UNTIL _i > length(_input) END REPEAT;

  IF _start > 0 THEN
    SET _r = MID(_input, _start, _i - _start);
    IF NOT _fromLeft THEN SET _r = REVERSE(_r);  END IF;
  END IF;
  RETURN _r;
END$$
于 2013-04-28T10:30:13.163 に答える