仅在 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}}';
我有一个带有 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}}';