在JSON列中查询数组元素

Joe*_*Joe 24 sql postgresql json lateral postgresql-9.3

最近升级到使用PostgreSQL 9.3.1来利用JSON功能.在我的表中,我有一个json类型的列,其结构如下:

{
   "id": "123",
   "name": "foo",
   "emails":[
      {
        "id": "123",
        "address": "somethinghere"
      },
      {
        "id": "456",
        "address": "soemthing"
      }
   ]
} 
Run Code Online (Sandbox Code Playgroud)

这只是用于问题目的的虚拟数据.

是否可以根据ID查询电子邮件数组中的特定项?
差不多:"返回id = 123的电子邮件""?

Erw*_*ter 51

是的,这是可能的:

SELECT *
FROM   tbl t, json_array_elements(t.json_col->'emails') AS elem
WHERE  elem->>'id' = 123;
Run Code Online (Sandbox Code Playgroud)

tbl作为您的表名,json_col是JSON列的名称.

这个相关答案的更多细节:

更多关于CROSS JOIN LATERAL这个相关答案的最后一段隐含的内容:

索引支持这种查询:


ada*_*amc 7

使用Postgres 9.4+中的JSONB列,您可以使用contains运算符@>来查询数组中的元素:

SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅查询JSON类型中的数组元素.

这是一个工作示例:

CREATE TABLE jsontest(data JSONB NOT NULL);
INSERT INTO jsontest VALUES (
  '{
     "name": "foo",
     "id": "123",
     "emails": 
     [
       {
         "address": "somethinghere",
         "id": "123"
       },
       {
         "address": "soemthing",
         "id": "456"
       }
     ]
  }'
);
SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';

data
----
{"id": "123", "name": "foo", "emails": [{"id": "123", "address": "somethinghere"}, {"id": "456", "address": "soemthing"}]}
Run Code Online (Sandbox Code Playgroud)

(1排)