2016-04-29 42 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