仅在 postgresql 中获取特定 json 标记的所有条目

Get all entries for a specific json tag only in postgresql

我有一个带有 json 字段的数据库,它有多个部分,包括一个名为 tags 的部分,还有下面的其他条目,但我只想 return 带有 "{"tags":{"+good":true}}".

"{"tags":{"+good":true}}"
"{"has_temps":false,"tags":{"+good":true}}"
"{"tags":{"+good":true}}"
"{"has_temps":false,"too_long":true,"too_long_as_of":"2016-02-12T12:28:28.238+00:00","tags":{"+good":true}}"

我可以通过我的 where 子句 trips.metadata->'tags'->>'+good' = 'true' 中的这条语句来完成部分工作,但是 return 是标签正确且正确的所有实例,包括上面的所有条目。我只想 return 带有特定语句 "{"tags":{"+good":true}}" 的条目。因此,取出以 has_temps 开头的两个条目。

关于如何做到这一点有什么想法吗?

如果我没看错,您可以检查 "tags" 键的文本值,如下所示:

select true 
where '{"has_temps":false,"too_long":true,"too_long_as_of":"2016-02-12T12:28:28.238+00:00","tags":{"+good":true}}'::json->>'tags'
= '{"+good":true}'

对于 jsonb 列,解决方案很明显:

with trips(metadata) as (
values
    ('{"tags":{"+good":true}}'::jsonb),
    ('{"has_temps":false,"tags":{"+good":true}}'),
    ('{"tags":{"+good":true}}'),
    ('{"has_temps":false,"too_long":true,"too_long_as_of":"2016-02-12T12:28:28.238+00:00","tags":{"+good":true}}')
)
select *
from trips
where metadata = '{"tags":{"+good":true}}';

        metadata         
-------------------------
 {"tags":{"+good":true}}
 {"tags":{"+good":true}}
(2 rows)

如果列的类型是 json 那么您应该将其转换为 jsonb:

...
where metadata::jsonb = '{"tags":{"+good":true}}';