web-dev-qa-db-ja.com

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

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

Lorem D9801 ipsum dolor sit amet

D9801はREGEXPです。すべてのstrong text説明には異なるコンテンツがありますが、私の正規表現は次のようになります:REGEXP 'D [[:digit:]] {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ホスティングを使用しています。

14
Marek Andrzejak

文字列から情報を取得するには、LOCATEおよび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)
)
3
James Rhoat

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

目的の動作を実行するコツは、気になる文字で始まり、正しい長さで、その後に数字が続く部分文字列を決定することです。一連の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)
1
RMathis