MySQLでREGEXPを使用してSUBSTRINGを使用する方法


14

次のような状況があります。MySQLを使用して、記述から正規表現を部分文字列にする必要があります。説明:

Lorem D9801 ipsum dolor sit amet

D9801はREGEXPです。すべての強力なテキスト記述は、異なるコンテンツを持っていますが、私の正規表現すべきであるように見えます:REGEXP「D [[:桁:]] {4}」

REGEXPの先頭は常に「D」、末尾は「xxxx」-末尾は4桁:Dxxxx

REGEXPがtrue / false値のみを返すことは知っていますが、「D9801」値のみを返すクエリを作成するにはどうすればよいですか?

私はこのようなことを試しました:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp

私はそれが間違っていることを知っているので、これを試してみます:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;

しかし、正規表現の位置を見つける方法は?

UDFについて聞いたことがありますが、使用できません。OVHホスティングを使用しています。



UDFを使用せずに何REGEXP関数から一致するパターンを検索するための機能で構築され、他のマッチング方法は、あなたがこのような状況でどのdoesntの仕事のために一致している完全な文字列を知ることに依存しているが存在しない
ペイロード

回答:


3

これには、文字列から情報を取得するためにLOCATEand SUBSTRING構文を使用する必要があります。ここで必要となる基本的なロケート構文について説明します

LOCATE(検索str、str、[位置])

search str =検索される文字列。

str =検索される文字列。

position(オプション)=検索の開始位置(2番目の引数内)からの位置。

必要なサブストリング関数はここで説明されていますが

SUBSTRING(str、pos、len)

str =文字列。

pos =開始位置。

len =文字の長さ。

これを表示する簡単な方法は、サブストリングを次のSUBSTRING(str FROM pos FOR len)と考えることです。

2番目の単語を取得するために使用した構文は以下のとおりです。抽出しようとしている2番目の単語の周りに常にあるスペースを利用しました。

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)

1

残念ながら、MySQLの正規表現関数は、式が存在するかどうかに応じてtrue、false、またはnullを返します。

目的の動作を実現するための秘Theは、どの部分文字列が重要な文字で始まり、正しい長さで、その後に数字が続くかを判断することです。一連のsubstring_index関数は、文字列を抽出するために使用されます...

set @string:='Lorem D9801 ipsum dolor sit amet';
select
case when @string like '% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',1),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',2),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',3),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',4),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',5),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
end as test_case;
+-----------+
| test_case |
+-----------+
| D9801     |
+-----------+
1 row in set (0.00 sec)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.