我想我正在尝试一些简单的东西,但几个小时后我就是不能让它工作。我有一个包含tags列的表,它是一个jsonb数组,看起来像这样:
[
{
"name": "e-commerce",
"weight": 400
},
{
"name": "management",
"weight": 200
},
{
"name": "content management",
"weight": 200
}
]
字符串
现在我想写一个查询,当名称与搜索字符串匹配时,它会返回完整的对象。到目前为止,我想到了这个:
SELECT * FROM data
WHERE tags is not null
AND EXISTS(
SELECT FROM data ad WHERE (ad.tags -> 'name' ->> 'education')::text
);
型
但我得到这个错误:
[42883] ERROR: operator does not exist: jsonb[] -> unknown Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
型
我不知道我应该在哪里做一个类型转换,这是否真的是问题所在。
我已经尝试了these线程的解决方案,但无济于事:-(
2条答案
按热度按时间lndjwyie1#
如果你想让每个匹配的对象在单独的一行上,你可以使用
jsonb_array_elements()
来取消嵌套对象数组,然后过滤:字符串
这适用于你有JSONB数组(所以数据的数据类型是
jsonb
)。另一方面,如果你有一个json对象数组(所以:
jsonb[]
),你可以用unnest
代替:型
注意,当两个对象在同一个数组中匹配时,这会生成两行。如果你只想要一行,你可以使用
exists
:型
ioekq8ef2#
您需要查询
json array
中的对象。使用jsonb_array_elements
创建这些对象,然后查询json,如-字符串
另外,在你最初的查询中,
这...
型
应该是-
型
或
型
编辑一:
由于您的数据类型不是jsonb而是jsonb[],因此需要使用
unnest
将其解嵌套为jsonb-型
或
型
第一个可能会给予错误,因为
tagObj
在该上下文中不可用