【问题标题】:Query json_array in where clauses by key and value通过键和值查询where子句中的json_array
【发布时间】:2020-06-02 04:11:12
【问题描述】:

我有一个选择查询,女巫返回一个 array_to_json 对象。我想根据具体的键和值过滤选择的结果。

这是我的实际查询:

select jsonarray
from (
         SELECT body.id_user,
                array_to_json(array_agg(row_to_json(body))) as jsonarray
         FROM (
                  SELECT  id_user, name, value
                  FROM table_1
                  group by id_user, name, value
              ) body
         group by body.id_user
     ) as test;

它返回很多这样的行:

[{"id_user": 1489, "name": "name 1", "value": "value aaaaaa"},  {"id_user": 1489, "name": "name 2", "value": "value babababab"}]

[{ "id_user": 1490, "name": "name 12", "value": "value aaaaaa"  }, { "id_user": 1490, "name": "name 2",  "value": "value babababab" }]

[ { "id_user": 1491, "name": "name 13", "value": "value aaaaaa"  }, { "id_user": 1491,  "name": "name 23",  "value": "value uouououo" }]

好吧,我只想要在 json 中包含字段“name”:“name 2”,“value”:“value babababab”的行...我试过了

select jsonarray->'name'
from (
....
     ) as test
where jsonarray->>'name'::text = 'name 2';

但它什么也不返回。还有其他查询方式吗?

【问题讨论】:

  • 您是否有理由不想从最里面的子查询中过滤它? WHERE name = 'name' AND value ='some_value'
  • 是的,有。这是因为我需要整个 json,如果我使用 where name = 'name' 我没有其他名称的字段,你明白吗?
  • 内部group by的目的是什么?为什么不用distinct
  • 目的是让很多行通过user_id只返回一个json数组。如果我不通过我的查询做内部组将不会返回我期望的全部结果......

标签: sql postgresql where-clause


【解决方案1】:

您可以在聚合期间检查name 2 是否存在:

SELECT jsonb_agg(to_jsonb(body)) as jsonarray
FROM (
  SELECT DISTINCT id_user, name, value
  FROM table_1
) body
group by body.id_user
having bool_or(name = 'name 2') -- those with at least one `name = 'name 2'`

Online example

【讨论】:

  • 感谢@a_horse_with_no_name 的回答,但如果我喜欢这样,我如何确保具有“名称 2”的行也具有该属性的值“”babababab”?
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多