28

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

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

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

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

4

4 回答 4

56

是的,这是可能的:

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

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

此相关答案中的更多详细信息:

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

支持这种查询的索引:

于 2013-11-08T21:21:11.783 回答
8

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

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

有关更多详细信息,请参阅查询 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"}]}

(1 行)

于 2017-01-30T01:54:43.837 回答
3

看到这篇文章,发现可以直接在表上查询,如下所示:

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

省略这部分:

json_array_elements(t.json_col->'emails')
于 2016-08-08T11:45:01.233 回答
-1

你可以这样做简单:

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  ;
于 2015-05-12T13:01:11.390 回答