从Postgres中获取嵌套JSON的值

时间:2016-12-11 09:32:20

标签: json postgresql

我有一张名为" Audio"用一列"成绩单"如下:

{"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"匹配某些关键字。

如果我执行以下查询,它会给我整个' s'音频的条目,其中一个" w"有文字" google"或者"所有。"

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 个答案:

答案 0 :(得分: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'])