2016-12-11 10 views
0

내가 열 "증명서"와 "오디오"라는 테이블이 중첩 된 JSON에서 값을 가져옵니다 :포스트 그레스

{"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 특정 키워드와 일치합니다.

다음 쿼리를 수행하면 Audio의 전체 "s"항목 중 "w"에 "google"또는 "all"이있는 항목이 표시됩니다.

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