查询JSON数组数据字段中的数据

cga*_*her 6 sql postgresql json psql

目前正在postgres 9.3中首次使用JSON字段,并且我在查询数组时遇到了一些困难.

具有JSON数组数据类型的字段称为"帐户",一些示例数据如下所示

[{name: "foo", account_id: "123"}, {name: "bar", account_id: "321"}]
Run Code Online (Sandbox Code Playgroud)

我希望能够找到拥有account_id 123的公司的ID.我目前遇到问题的查询如下:

select id from companies where json_array_elements(accounts)->>'account_id' = '123'
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

WHERE的参数不能返回一个集合

Cra*_*ger 12

json_array_elements(...)返回一个集合,应用->>=集合的结果也是如此.注意:

regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
 ?column? 
----------
 t
 f
(2 rows)
Run Code Online (Sandbox Code Playgroud)

您可能希望能够编写'123' = ANY (...)但不幸的是,如果没有数组输入则不支持.令人惊讶的是'123' IN (...),我认为我们不得不解决这个问题.

所以,我会用LATERAL.这是一种方法,如果它有多个匹配,它将多次返回公司ID:

CREATE TABLE company AS SELECT 1 AS id, '[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]'::json AS accounts;

SELECT id 
FROM company c,
LATERAL json_array_elements(c.accounts) acc 
WHERE acc ->> 'account_id' = '123';
Run Code Online (Sandbox Code Playgroud)