postgreSQL -如何按json_agg值过滤

ss2ws0br  于 2022-12-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(155)

我在t_table和s_table之间建立了连接表。
它们之间存在多对多的关系。
s_表格
| 标识符|s_值|
| - -|- -|
| 一个|一个|
| 2个|2个|
| 三个|三个|
t_表格
| 标识符|t值|
| - -|- -|
| 一个|100个|
| 2个|二百|
| 三个|三百|
t标识s标识表
| s标识符(_I)|测试标识|
| - -|- -|
| 一个|一个|
| 一个|2个|
| 2个|2个|
| 2个|三个|
| 三个|一个|
| 三个|三个|
首先,我通过此查询按s_table id聚合了t_value group

SELECT 
  t_id_s_id_table.s_id,
  JSON_AGG(t_value) AS json_agg
FROM
  t_id_s_id_table
LEFT JOIN
  t_table
ON
 t_table.id = t_id_s_id_table.t_id
GROUP BY 
 t_id_s_id_table.s_id

我得到了这个结果。
| s标识符(_I)|json_agg|
| - -|- -|
| 一个|100个、200个|
| 2个|两百、三百|
| 三个|一百、三百|

我想做的事

我想获取所有关联的json_agg值包括100的s_id。(这意味着s_id = 1和3)
我尝试了以下查询

SELECT *
  FROM (
    SELECT 
      t_id_s_id_table.s_id,
      JSON_AGG(t_value) AS json_agg
    FROM
      t_id_s_id_table
    LEFT JOIN
      t_table
    ON
     t_table.id = t_id_s_id_table.t_id
    GROUP BY 
     t_id_s_id_table.s_id
  )
  WHERE COUNT(json_agg = 100) > 0

但它对我不起作用。我得到了错误operator does not exist: json = integer
我怎样做SQL才能得到这个结果呢?我用的是PostgreSQL 11.2。提前谢谢你。

nvbavucw

nvbavucw1#

不管查询的业务逻辑如何-因为需要计算有多少个json_agg数组元素等于100,所以where子句应该是

WHERE (
  select count(*) 
  from json_array_elements_text(json_agg) jae 
  where jae::integer = 100
) > 0

或者更简单地说,等于100的数组元素是否存在

WHERE exists (
  select from json_array_elements_text(json_agg) jae 
  where jae::integer = 100
)

顺便说一句,最好不要使用函数名(json_agg)作为列名。

lyfkaqu1

lyfkaqu12#

最简单的方法是使用HAVING而不是WHERE来作用于每个组,并使用BOOL_OR运算符来比较组中是否有任何项等于100;

SELECT 
  t_id_s_id_table.s_id,
  JSON_AGG(t_value) AS json_agg
FROM
  t_id_s_id_table
LEFT JOIN
  t_table
ON
 t_table.id = t_id_s_id_table.t_id
GROUP BY 
 t_id_s_id_table.s_id
HAVING BOOL_OR(t_value=100)

A DBfiddle to test with.

相关问题