2016-05-23 10 views
1

私はPostgresクエリの初心者です。私は特定のセットに基づいて列の各レコードから部分文字列を引き出そうとしています。 キーワード 'start'の間の各レコードの部分文字列を& 'end'とします。つまり、あるレコードで 'start' & 'end'が複数回出現する可能性があり、 'start' & 'end'キーワードの各セットの間で何が起こるかを抽出する必要があります。1レコードから複数の文字列を引く

enter image description here

我々は、むしろプロシージャを作成するよりも、Postgresの中に単一のクエリでこれを達成する可能性を持っていますか?はいの場合は、この情報を参考にしてください。

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-そういうときに尋ねる質問/ 285557#285557 –

答えて

0

/は常に要素を区切ると仮定すると、string_to_array()を使用して文字列を複数の要素に変換し、unnest()を使用して配列を結果に変換できます。その後、中括弧区切り文字を取り除くためにregexp_replace()を使用することができます。

select d.id, regexp_replace(t.name, '{start}|{end}', '', 'g') 
from the_able d 
    cross join unnest(string_to_array(d.body,'/')) as t(name); 

SQLFiddle例:http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8863

+0

これはjuですデータの例。データは上記と同じ形式ではありません。 {end}/{start}の間に他のデータがある可能性があります。主な目的は、特定のキーワード間でデータを抽出することです。 – Keen2Learn

+0

@ Keen2Learn:**実際の**データを投稿してください。投稿した日付が間違っている場合は –

0

あなたが間のコンテンツにマッチする正規表現を使用して、とPostgreSQLの正規表現関数regexp_matches(このすべてを達成しますあなたのタグ)とREGEXP_REPLACE(タグを削除する):

with t(id,body) as (values 
        (1, '{start}John{end}/{start}Jack{end}'), 
        (2, '{start}David{end}'), 
        (3, '{start}Ken{end}/{start}Kane{end}/{start}John{end}')) 
select id, regexp_replace(
      (regexp_matches(body, '{start}.*?{end}', 'g'))[1], 
      '^{start}|{end}$', '', 'g') matches 
from t 
関連する問題