2016-04-29 3 views
1

Я пытаюсь проанализировать следующие данные json и использовать его в соответствии с пунктом where.Postgres: Разбор данных JSON в sql

Basic":{ 
    "General":{ 
     "Field1":1234, 
     "Field2":"6.86" 
    }, 
    "Stream 0":{ 
     "Type":"LDAP", 
     "Field4":"LALA1" 
    }, 
    "Stream 1":{ 
     "Type":"KERBEROS", 
     "Field4":"LALA2" 
    }, 
    "Stream 2":{ 
     "Type":"SAML", 
     "Field4":"LALA3" 
    }, 

Я могу достигнуть Type бирки как это.
table.column_json::json->'Basic'->'Stream 0'->'Type'

Порядок Stream # не определен и не может более чем на 3 Stream теги.

Как я могу перебирать каждый поток и находить, если Type: is "SAML", то Field4 значение "LALA3".

ответ

1

Поскольку у вас есть несколько различных ключей, которые вы хотите искать через, что вам нужно «распаковать» пару K/V, а затем сделать совпадающую строку:

SELECT DISTINCT t.* 
FROM table t, json_each(t.column_json::json->'Basic') j(k, v) 
WHERE j.k LIKE 'Stream%' 
    AND j.v->>'Type' = 'SAML' 
    AND j.v->>'Field4' = 'LALA3'; 

Обратите внимание, что функция json_each() является PG9.3 + ,

+0

'json_each()' работал для меня, но '=' дает ошибку 'operator does not exist'. Я попытался использовать 'j.v -> 'Type' :: varchar = 'SAML'', но не повезло. –

+1

А, да. Оператором '- >>' должен был быть полем 'text'. См. Обновленный ответ. – Patrick