2017-12-19 33 views
1

Postgresの10のフィルタを選択します。私は、下記の表と問い合わせがありますネストされたJSON配列

CREATE TABLE individuals (
    uid character varying(10) PRIMARY KEY, 
    data jsonb 
); 

SELECT data->'files' FROM individuals WHERE uid = 'PDR7073706' 

それは、この構造体を返します。

[ 
{"date":"2017-12-19T22-35-49","type":"indiv","name":"PDR7073706_indiv_2017-12-19T22-35-49.jpeg"}, 
{"date":"2017-12-19T22-35-49","type":"address","name":"PDR7073706_address_2017-12-19T22-35-49.pdf"} 
] 

私はで2つのフィルタを追加することに苦労しています日時。 (!違法な擬似コード)のような:

'タイプ' = "INDIV"

など:

'タイプ' = "INDIV" とMax( '日付')

これはおそらく簡単ですが、私はこのナッツを割ることはできませんし、あなたの助けが必要です!

答えて

1

データ型を仮定すると、jsonbが不足しています。
使用最初の句の封じ込めオペレータ@>(「タイプ」=「INDIV」):

SELECT data->'files' 
FROM individuals 
WHERE uid = 'PDR7073706' 
AND data -> 'files' @> '[{"type":"indiv"}]'; 

がインデックスの様々な種類の支持することができます。参照:

第二節(とMax( '日付'))は、よりトリッキーです。
"type":"indiv"のJSON配列要素も最新の"date"の行を取得します。

SELECT i.* 
FROM individuals i 
JOIN LATERAL (
    SELECT * 
    FROM jsonb_array_elements(data->'files') 
    ORDER BY to_timestamp(value ->> 'date', 'YYYY-MM-DD"T"HH24-MI-SS') DESC NULLS LAST 
    LIMIT 1 
    ) sub ON sub.value -> 'type' = '"indiv"'::jsonb 
WHERE uid = 'PDR7073706' 
AND data -> 'files' @> '[{"type":"indiv"}]' -- optional; may help performance 

to_timestamp(value ->> 'date', 'YYYY-MM-DD"T"HH24-MI-SS')あなた宣言されていないタイムスタンプ形式の私の推測です。 Details in the manual here.

最後のフィルタは冗長でオプションです。

AND data -> 'files' @> '[{"type":"indiv"}]' 

関連:

+0

それはあなたのためにたくさんの提案です。あなたは正しいです、私はテーブルのスキーマを投稿している必要があります、私は質問を更新しました。最初のクエリはうまく機能しますが、2番目の(複雑な)クエリはエラーを受け取ります。 エラー:列 "elem"は存在しません。 :42703文字:223 何が間違っているのを見つけるのを助けてくれますか? – uzla

+0

@uzla:投稿時に列名を変更しました。 'jsonb_array_elements()'のデフォルトの結果カラム名は 'value'です。それを今使っている。 –

+0

ありがとう!できます!そして訂正してくれてありがとう!私は何か新しい毎日を学ぶ:-) – uzla

関連する問題