2016-04-07 21 views
1

次の構造を持つ `test 'という名前のテーブルがあります。いくつかの区切り文字に基づいて行を複数の行に分割するSQLクエリ

category  key             value  
name   real_name:Brad,nick_name:Brady,name_type:small  NOVALUE 
other   description           cool 

しかし、私は:区切り文字は値がNOVALUEに等しい値列の一部であるべき後,区切り文字と値に基づいて複数の行にkey列を壊したいです。

このため sqlクエリを作成する方法
category  key    value 
name   real_name   Brad 
name   nick_name   Brady 
name   name_type   small 
other   description  cool  

:だから、出力は次のようになります。私はpostgresqlを使用しています。

助けが必要ですか?前もって感謝します。

+0

私はいくつかの区切り文字に基づいて複数の列に文字列を分割する必要はありません。代わりに、私は1つの区切り文字に基づいて複数の行に分割し、各行を他の区切り文字に基づいて複数の列に分割したいと考えています。 –

+0

最初に区切られた値を格納しないでください。 –

答えて

1

あなたがこれを行うにはstring_to_arrayとアンネストを使用することができます。

select ts.category, 
     split_part(key_value, ':', 1) as key, 
     split_part(key_value, ':', 2) as value 
from test ts 
    cross join lateral unnest(string_to_array(ts.key, ',')) as t (key_value) 
where ts.value = 'NOVALUE' 

union all 

select category, 
     key, 
     value 
from test 
where value <> 'NOVALUE'; 

SQLFiddle例:http://sqlfiddle.com/#!15/6f1e6/1

+0

ありがとう、Uは天才です。私はテストしました、これはまさに私が欲しかったものです。再度、感謝します。 –

+0

こんにちは@a_horse_with_no_name、私は少し質問を変更しました。私はあなたにもう一度尋ねるのはばかげているかどうかわからないが、私はそれに苦労している。私はそれに多くの時間を費やしたくないので、すぐにそれをする必要があります。あなたは私を助けてくれますか?ありがとう。 –

+0

@Rajeevkumar:あなたが答えを受け取った後で質問を変更することは素晴らしいとは考えられません。私は自分の答えを更新しました –

0
select category, 
     split_part(key_value, ':', 1) as key, 
     case when value = 'NOVALUE' then split_part(key_value, ':', 2) else value end 
from test 
    cross join lateral unnest(string_to_array(key, ',')) as t (key_value) 
+1

このコードで質問に答えるかもしれませんが、_why_および/または_how_に関する追加の文脈を に入力すると、 という質問に回答すると、長期的には の値が大幅に改善されます。あなたの答えを[編集]して、説明を加えてください。 –

関連する問題