【问题标题】:Filtering out of required JSON object from a JSON Array column in postgresql with the input as single parameter从 postgresql 中的 JSON Array 列中过滤出所需的 JSON 对象,并将输入作为单个参数
【发布时间】:2020-09-25 04:13:26
【问题描述】:

我有一个选择查询返回,它显示如下结果:

select * from table 给出如下结果

我有一个名为 Apple 的参数,如果我在查询中的某处传递参数,我应该得到如下结果

如何在 postgresql 中得到这个。如果有人知道,请在下面分享答案。

【问题讨论】:

  • 样本数据最好显示为formatted text。请参阅here,了解有关如何创建漂亮表格的一些提示。
  • PostgreSQL 10.10 on x86_64-pc-linux-gnu,由 gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) 编译,64 位

标签: postgresql


【解决方案1】:

为了清楚起见,我会使用辅助函数来执行此操作。而且它可能是可重复使用的。

create or replace function filter_jsonb_array(arr jsonb, fruit text) 
returns jsonb language sql immutable as 
$$
select coalesce
(
 (select jsonb_agg(j) from jsonb_array_elements(arr) j where j ->> 'fruit' = fruit),
 '[]'::jsonb
);
$$;

然后

select "Column_A", "Column_B", filter_jsonb_array("Column_JSONARRAY", 'Apple') from table_;

如果你不想要一个函数,那么函数体可以直接放在选择查询中。

select 
  "Column_A", 
  "Column_B",
  coalesce
  (
   (select jsonb_agg(j) from jsonb_array_elements("Column_JSONARRAY") j where j ->> 'fruit' = 'Apple'),
   '[]'::jsonb
  ) "Column_JSONARRAY"
 from table_;

【讨论】:

  • 我使用了第二个选项,它没有使用函数,它非常好。但我的下一个问题是,如果水果的日期类型是一个不同的字符 [] arary,我应该使用什么?我试过这个 where 'mango'=ANY(j->>'fruit') 但无法正确获得结果
  • 试试= any((select array_agg(t) from jsonb_array_elements_text(j->'fruit') t)::text[])。只有当fruit 是一个数组时它才会起作用。
  • 使用上述。我得到了我预期的答案。我的最后一个问题是我想在我的参数中使用 LOWER 函数。怎么办?
  • 我宁愿降低参数和数组值。所以就在这里。 where lower('Mango') = any((select array_agg(lower(t)) from jsonb_array_elements_text(j->'fruit') t)::text[])
  • 你是个天才。我所寻找的,我完全明白了。感谢核心
【解决方案2】:

考虑到您的列Column_JSONARRAY 的数据类型是JSONB,试试这个:

with cte as (
   SELECT column_a, column_b,  (column_jsonarray ->> ( index_-1 )::int)::jsonb  AS "column_jsonarray"
     FROM table_
    CROSS JOIN jsonb_array_elements(column_jsonarray)
     WITH ORDINALITY arr(array_,index_)
    WHERE array_->>'fruit' in ('Apple') 
)

select t1.column_a, t1.column_b, jsonb_agg(t2.column_jsonarray) 
from table_ t1 
left join cte t2 on t1.column_a =t2.column_a and t1.column_b =t2.column_b

group by t1.column_a, t1.column_b

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 2017-12-11
    • 2017-04-23
    • 1970-01-01
    • 2019-05-21
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多