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这个相关答案的最后一段隐含的内容:
索引支持这种查询:
使用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排)
| 归档时间: |
|
| 查看次数: |
22298 次 |
| 最近记录: |