2016-07-29 15 views
0

私は、tagsと呼ばれるものを含む複数の部分を持つjsonフィールドを持つデータベースを持っていますが、他のエントリがありますが、"{"tags":{"+good":true}}"でフィールドのみを返したいとします。特定のjsonタグのすべてのエントリをpostgresqlで取得する

"{"tags":{"+good":true}}" 
"{"has_temps":false,"tags":{"+good":true}}" 
"{"tags":{"+good":true}}" 
"{"has_temps":false,"too_long":true,"too_long_as_of":"2016-02-12T12:28:28.238+00:00","tags":{"+good":true}}" 

私は私のwheretrips.metadata->'tags'->>'+good' = 'true'にこの文でそこに道の一部を取得することができますが、それはタグが上記のすべてのエントリを含む良いと真であるすべてのインスタンスを返します。特定の明細書"{"tags":{"+good":true}}"で返信したいと思います。だからhas_tempsを開始する2つのエントリを取り出します。

これを行う方法についてのご意見はありますか?

+0

は、それが9.5または9.4であります..? –

答えて

1

をソリューションは明らかです。

with trips(metadata) as (
values 
    ('{"tags":{"+good":true}}'::jsonb), 
    ('{"has_temps":false,"tags":{"+good":true}}'), 
    ('{"tags":{"+good":true}}'), 
    ('{"has_temps":false,"too_long":true,"too_long_as_of":"2016-02-12T12:28:28.238+00:00","tags":{"+good":true}}') 
) 
select * 
from trips 
where metadata = '{"tags":{"+good":true}}'; 

     metadata   
------------------------- 
{"tags":{"+good":true}} 
{"tags":{"+good":true}} 
(2 rows) 

列の場合はタイプがjsonであるあなたはjsonbにキャストする必要があります

... 
where metadata::jsonb = '{"tags":{"+good":true}}'; 
+0

マジックありがとう!!!それは私が知らなかったjsonbのようなデータをキャストしたものでした。 – hselbie

0

私は右のあなたを取得する場合、あなたはここのように、「タグ」キーのテキスト値を確認することができます。jsonb列で

select true 
where '{"has_temps":false,"too_long":true,"too_long_as_of":"2016-02-12T12:28:28.238+00:00","tags":{"+good":true}}'::json->>'tags' 
= '{"+good":true}' 
関連する問題