我想针对jsonbPostgres中的类型编写一个查询,给定一组客户 ID 将找到相应的组。
鉴于此示例表:
CREATE TABLE grp(d JSONB NOT NULL);
INSERT INTO grp VALUES
('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
, ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
, ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');
Run Code Online (Sandbox Code Playgroud)
我发现了类似的问题(针对多个值的 PostgreSql JSONB SELECT)并设法使用此查询在简单数组上实现了我想要的:
SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];
Run Code Online (Sandbox Code Playgroud)
但是,当数组包含 JSON对象时,我无法使其工作:
SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];
Run Code Online (Sandbox Code Playgroud)
这是我对查询的期望:
grp“第一个”-> 客户“1”
grp "第三" -> 客户 "5"
我有一个名为“user”的字段,其中包含一个大致如下所示的 json 数组:
"user":
[{ "_id" : "1", "count" : "4" }, { "_id" : "3", "count": "4"}]
Run Code Online (Sandbox Code Playgroud)
现在我想要一个像这样的查询:
select count from tablename where id = "1"
Run Code Online (Sandbox Code Playgroud)
我无法count从 PostgreSQL 9.4 中的 json 对象数组中获取特定字段。
使用:Postgres 14.2。
目标:获取表中所有不同国家/地区的列表。
该列address是一种JSONB列类型,包含一个结构如下的数组:
{
"address":[
{
"types":["route"],
"long_name":"20203 113B Ave",
"short_name":"20203 113B Ave"
},
{
"types":["locality","political"],
"long_name":"Maple Ridge",
"short_name":"Maple Ridge"
},
{
"types":["administrative_area_level_3","political"],
"long_name":"Maple Ridge",
"short_name":"Maple Ridge"
},
{
"types":["administrative_area_level_2","political"],
"long_name":"Greater Vancouver",
"short_name":"Greater Vancouver"
},
{
"types":["administrative_area_level_1","political"],
"long_name":"British Columbia",
"short_name":"BC"
},
{
"types":["country","political"],
"long_name":"Canada",
"short_name":"CA"
},
{
"types":["postal_code"],
"long_name":"V2X 0Z1",
"short_name":"V2X 0Z1"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何过滤这个对象数组,使其仅返回数组索引(如果包含)的值"long_name"(例如) ?Canadatypes"country"
我正在尝试类似的事情,但显然,我只想返回国家/地区,而不是整个品牌。
SELECT * from brand
where address::text ilike ANY (ARRAY['%country%'::text]);
Run Code Online (Sandbox Code Playgroud)
此查询失败并显示:
Run Code Online (Sandbox Code Playgroud){ "address":[ …