2016-12-11 4 views
0

にネストされたJSONから値を取得します。ここで、「W私は次のようにコラム「転写」と「オーディオ」と呼ばれるテーブルを持っているPostgresの

{"transcript": [ 
    {"p": 0, "s": 0, "e": 320, "c": 0.545, "w": "This"}, 
    {"p": 1, "s": 320, "e": 620, "c": 0.825, "w": "call"}, 
    {"p": 2, "s": 620, "e": 780, "c": 0.909, "w": "is"}, 
    {"p": 3, "s": 780, "e": 1010, "c": 0.853, "w": "being"} 
    ... 
    ]} 

私は「P」の値を取得したいと思います特定のキーワードと一致します。

次のクエリを実行すると、「w」に「google」または「all」という単語が含まれているAudioのエントリ全体が表示されます。

select json_array_elements(transcript->'transcript')->>'s' 
from Audio, 
    json_array_elements(transcript->'transcript') as temp 
where temp->>'w' ilike any(array['all','google']) 

条件が満たされている場合、どのように「p」の値だけを得ることができますか?

編集: "p"とその対応するオーディオIDの値を同時に取得するにはどうすればよいですか?

答えて

1

そこから共通テーブル式と試合にあなたの転写産物の配列要素を選択します。

WITH transcript AS (
    SELECT json_array_elements((transcript -> 'transcript')) AS line 
    FROM audio 
) 
SELECT line ->> 'p' 
FROM transcript 
WHERE line ->> 'w' ILIKE ANY (ARRAY ['all', 'google']); 

これは、オーディオ・テーブル内のすべての行から一致する行を選択します。私は結果を部分行の行に限定したいと思うでしょう。その場合、クエリを絞り込む必要があります。 idの場合、次のようにしてください。

WITH transcript AS (
    SELECT 
     id, 
     json_array_elements((transcript -> 'transcript')) AS line 
    FROM audio 
    WHERE id = 1 
) 
SELECT 
    id, 
    line ->> 'p' 
FROM transcript 
WHERE line ->> 'w' ILIKE ANY (ARRAY ['call', 'google']) 
+0

答えてくれてありがとう!私はpとその対応するIDの値の両方を得ることができますが、クロス結合条件を避けてください。私は両方の行を選択しようとしました - "p"とIDが、私は結果が倍をすべて数えると思います。 – YAL

+0

この例にいくつかのコメントを追加しました。私は 'id 'がどこから来たのかについて仮定をしなければならなかったが、うまくいけばその例は十分一般的である。 – teppic

関連する問題