最近升级到使用PostgreSQL 9.3.1来利用JSON功能。在我的表中,我有一个json类型的列,其结构如下:
{
"id": "123",
"name": "foo",
"emails":[
{
"id": "123",
"address": "somethinghere"
},
{
"id": "456",
"address": "soemthing"
}
]
}
这只是用于问题目的的虚拟数据。
是否可以根据ID查询电子邮件数组中的特定项目?
差不多:“返回id = 123的电子邮件”“?
答案 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 ;