58

次のようなmysqlクエリが必要です。

select <second word in text> word, count(*) from table group by word;

mysql のすべての正規表現の例は、テキストが式と一致するかどうかを照会するために使用されますが、式からテキストを抽出するためには使用されません。そのような構文はありますか?

4

9 に答える 9

45

以下は、OPの特定の問題(文字列の2番目の単語を抽出する)に対して提案された解決策ですが、mc0eの回答が示すように、実際に正規表現の一致を抽出することは、MySQLではすぐにサポートされないことに注意してください。これが本当に必要な場合は、基本的に1)クライアントで後処理を行うか、2)それをサポートするMySQL拡張機能をインストールするかを選択します。


BenWellsはそれをほぼ正しいとしています。彼のコードから作業して、ここに少し調整されたバージョンがあります:

SUBSTRING(
  sentence,
  LOCATE(' ', sentence) + CHAR_LENGTH(' '),
  LOCATE(' ', sentence,
  ( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') )
)

実用的な例として、私は以下を使用しました:

SELECT SUBSTRING(
  sentence,
  LOCATE(' ', sentence) + CHAR_LENGTH(' '),
  LOCATE(' ', sentence,
  ( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') )
) as string
FROM (SELECT 'THIS IS A TEST' AS sentence) temp

これにより、単語が正常に抽出されますIS

于 2010-10-26T08:27:28.037 に答える
27

文の 2 番目の単語を抽出する短いオプション:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('THIS IS A TEST', ' ',  2), ' ', -1) as FoundText

SUBSTRING_INDEX の MySQL ドキュメント

于 2012-09-07T11:51:26.487 に答える
14

http://dev.mysql.com/によると、SUBSTRING関数は開始位置を使用し、次に長さを使用するため、2番目の単語の関数は次のようになります。

SUBSTRING(sentence,LOCATE(' ',sentence),(LOCATE(' ',LOCATE(' ',sentence))-LOCATE(' ',sentence)))
于 2010-10-26T08:02:27.577 に答える
7

いいえ、正規表現を使用してテキストを抽出するための構文はありません。通常の文字列操作関数を使用する必要があります。

または、データベースから値全体 (データ転送が多すぎることが懸念される場合は最初の n 文字) を選択し、クライアントで正規表現を使用します。

于 2010-10-26T07:30:34.683 に答える
5

他の人が言ったように、mysql は部分文字列を抽出するための正規表現ツールを提供していません。ただし、ユーザー定義関数で mysql を拡張する準備ができている場合は、それらを使用できないと言っているわけではありません。

https://github.com/mysqludf/lib_mysqludf_preg

ソフトウェアを配布したい場合、これはあまり役に立たず、ソフトウェアのインストールの妨げになるかもしれませんが、社内ソリューションの場合は適切かもしれません.

于 2013-08-19T06:00:22.730 に答える
5

JSON文字列の特定のフィールドの値を取得するという同様の問題の出発点として、Brendan Bullenの回答を使用しました。しかし、私が彼の答えにコメントしたように、それは完全に正確ではありません. 左の境界が元の質問のような単なるスペースではない場合、不一致が増加します。

修正されたソリューション:

SUBSTRING(
    sentence,
    LOCATE(' ', sentence) + 1,
    LOCATE(' ', sentence, (LOCATE(' ', sentence) + 1)) - LOCATE(' ', sentence) - 1
)

2 つの違いは、SUBSTRING インデックス パラメータの +1 と長さパラメータの -1 です。

「提供された2つの境界の間で文字列の最初の出現を見つける」ためのより一般的な解決策の場合:

SUBSTRING(
    haystack,
    LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>'),
    LOCATE(
        '<rightBoundary>',
        haystack,
        LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>')
    )
    - (LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>'))
)
于 2016-08-18T19:50:12.080 に答える
2

そんなことはありえないと思います。関数を使用SUBSTRINGして、必要な部分を抽出できます。

于 2010-10-26T07:30:28.520 に答える
-3

フィールドの値は次のとおりです。

 "- DE-HEB 20% - DTopTen 1.2%"
SELECT ....
SUBSTRING_INDEX(SUBSTRING_INDEX(DesctosAplicados, 'DE-HEB ',  -1), '-', 1) DE-HEB ,
SUBSTRING_INDEX(SUBSTRING_INDEX(DesctosAplicados, 'DTopTen ',  -1), '-', 1) DTopTen ,

FROM TABLA 

結果は次のとおりです。

  DE-HEB       DTopTEn
    20%          1.2%
于 2012-10-31T23:44:07.027 に答える