在JSON列中查询数组元素

时间:2013-10-24 13:59:33

标签: sql json postgresql postgresql-9.3 lateral

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

{
   "id": "123",
   "name": "foo",
   "emails":[
      {
        "id": "123",
        "address": "somethinghere"
      },
      {
        "id": "456",
        "address": "soemthing"
      }
   ]
} 

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

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

4 个答案:

答案 0 :(得分:50)

是的,这是可能的:

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

tbl是您的表名,json_col是JSON列的名称。

此相关答案中的更多详情:

有关此相关答案最后一段中隐式CROSS JOIN LATERAL的更多信息:

支持此类查询的索引:

答案 1 :(得分:7)

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

SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';

有关详细信息,请参阅Query for array elements inside JSON type

这是一个有效的例子:

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"}]}

(1行)

答案 2 :(得分:2)

遇到这篇文章,发现你可以直接在桌面上查询:

SELECT *
FROM   table_name, json_array_elements(json_column) AS data
WHERE  data->>'id' = 123;

省略这一部分:

json_array_elements(t.json_col->'emails')

答案 3 :(得分:0)

你可以这么简单:

SELECT * FROM table WHERE emails->>'id' = '123';

似乎你把id存储为字符串,如果它是一个整数你就可以这样做:

SELECT *  from table WHERE cast(emails->>'id' as integer ) = 123  ;

或者您可以获取ID为>的所有行10

SELECT *  from table WHERE cast(emails->>'id' as integer ) > 10  ;