2016-04-29 50 views
1

我想解析下面的json數據並在where子句下使用它。Postgres:解析sql中的JSON數據

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:"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()'爲我工作,但'='給'運算符不存在'錯誤。我嘗試使用'j.v - >'Type':: varchar ='SAML',但沒有運氣。 –

+1

啊,是的。它應該是' - >>'操作符將字段作爲'text'。查看更新的答案。 – Patrick