次のような状況です。 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ホスティングを使用しています。
文字列から情報を取得するには、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)
)
残念ながら、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)