13

テーブルの文字列列から単語を抽出したい。

description
===========================
abc order_id: 2 xxxx yyy aa
mmm order_id: 3 nn kk yw

期待される結果セット

order_id
===========================
2
3

テーブルには最大100行、テキストの長さは最大256文字、列には常に1行がorder_id存在します。したがって、パフォーマンスは問題ではありません。

Oracleでは、REGEXP_SUBSTRこの問題に使用できます。MySQLでこれをどのように解決しますか?

編集1

私は問題を解決するためにLOCATEとSUBSTRを使用しています。コードは醜いです。コードを書いた10分後、私はそのような醜いコードを書いた男を罵倒しています。

MySQLドキュメントでREGEXP_SUBSTR関数が見つかりませんでした。しかし、私はそれが存在することを望んでいます。

回答:テーブルを最適化できないのはなぜですか?なぜデータがこんなに馬鹿げた形で保存されているのですか?

私が示した例は、私が解決しようとしている問題を示しています。実際のシナリオでは、非同期タスクを実行するためにDBベースのサードパーティのキューイングソフトウェアを使用しています。キューはRubyオブジェクトをテキストとしてシリアル化します。テーブル構造やデータ形式を制御することはできません。キュー内のタスクは繰り返し発生する可能性があります。テストのセットアップでは、データが古くなったために、繰り返し発生するタスクの一部が失敗しています。エラーを防ぐために、これらのタスクを削除する必要があります。このようなエラーは一般的ではないため、正規化されたシャドウテーブルを維持したくありません。

4

4 に答える 4

10

Konerakが言ったように、MySqlにはREGEXP_SUBSTRに相当するものはありません。SUBSTRINGロジックを使用して必要なことを行うことができますが、それは醜いです:

SELECT
  SUBSTRING(lastPart.end, 1, LOCATE(' ', lastPart.end) - 1) AS orderId
FROM
  (
    SELECT
      SUBSTRING(dataset.description, LOCATE('order_id: ', dataset.description) + LENGTH('order_id: ')) AS end
    FROM
      (
        SELECT 'abc order_id: 2 xxxx yyy aa' AS description
        UNION SELECT 'mmm order_id: 3 nn kk yw' AS description
        UNION SELECT 'mmm order_id: 1523 nn kk yw' AS description
      ) AS dataset
    ) AS lastPart

編集: MySqlでperl正規表現へのアクセスを提供するこのユーザー定義関数を試すことができます

SELECT 
  PREG_CAPTURE( '/.*order_id:\s(\d+).*/', dataset.description,1)
FROM
  (
    SELECT 'abc order_id: 2 xxxx yyy aa' AS description
    UNION SELECT 'mmm order_id: 3 nn kk yw' AS description
    UNION SELECT 'mmm order_id: 1523 nn kk yw' AS description
  ) AS dataset
于 2010-04-30T06:45:40.903 に答える
10

「MySQLドキュメントでREGEXP_SUBSTR関数が見つかりませんでした。しかし、それが存在することを望んでいます。」

はい、MySQL8.0以降でサポートされています。正規表現

REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])

パターンpatで指定された正規表現に一致する文字列exprのサブ文字列を返します。一致するものがない場合は、NULLを返します。exprまたはpatがNULLの場合、戻り値はNULLです。

于 2018-04-19T19:38:00.630 に答える
5

または、これを実行して醜さを自分で保存することができます:

select SUBSTRING_INDEX(SUBSTRING_INDEX('habc order_id: 2 xxxx yyy aa',' ',3),' ',-1);
于 2016-11-20T19:00:32.360 に答える
1

MySQLに相当するものはありません。MySQL REGEXPは文字列の照合には使用できますが、文字列の変換には使用できません。

ストアドプロシージャと多くのREPLACE/SUBSTRINGロジックを操作するか、プログラミング言語で操作することができます。これが最も簡単なオプションです。

しかし、データ形式が適切に選択されていると確信していますか?order_idが必要な場合は、別の列に格納して、インデックスを配置したり、結合などを使用したりできるようにするのは理にかなっていますか?

于 2010-04-30T06:35:04.850 に答える