【问题标题】:Postgres extract value from jsonb arrayPostgres从jsonb数组中提取值
【发布时间】:2017-02-09 11:52:27
【问题描述】:

我有一个带有如下数组的 jsonb 字段:

[  
   {  
      "type":"discount",
      "title":"Discount 10%"
   },
   {        
      "file":"zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf",
      "type":"menu",
      "title":"Some menu title etc"
   }
]

如果数组中有 type=menu,我想获取 file 属性。

我设法做的是知道是否有一个,但我如何最终提取文件值?

case when offers @> '[{"type":"menu"}]' then true else false end

我不想在下面做这样的事情,因为数组可能不包含折扣类型。

offers->1->'file'

【问题讨论】:

  • 试试json_array_elements这个?..
  • @VaoTsun 运气不好

标签: postgresql postgresql-9.4 jsonb


【解决方案1】:

使用jsob_array_elements()->> 运算符(参见JSON Functions and Operators。)

with a_table(json_col) as (
values (
'[  
   {  
      "type":"discount",
      "title":"Discount 10%"
   },
   {        
      "file":"zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf",
      "type":"menu",
      "title":"Some menu title etc"
   }
]'::jsonb)
)

select value->>'file' as filename
from a_table,
lateral jsonb_array_elements(json_col)
where value->>'type' = 'menu'

                                    filename                                     
---------------------------------------------------------------------------------
 zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf
(1 row)

【讨论】:

  • 为什么使用横向而不是普通的 jsonb_array_elements ?
  • 应该在FROM 子句中调用返回一组行的函数,横向连接是执行此操作的自然方法。
【解决方案2】:

例如:

t=# with a as (with v as (select '[
   {
      "type":"discount",
      "title":"Discount 10%"
   },
   {
      "file":"zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf",
      "type":"menu",
      "title":"Some menu title etc"
   }
]'::jsonb j)
select jsonb_array_elements(j) r from v) select r->>'file' from a where r->>'type' = 'menu';
                                    ?column?
---------------------------------------------------------------------------------
 zx5rP8EoacyfhqGndcSOnP8VYtkr9Ya8Nvf7oYL98YDsM1CLMYIurYvfVUU4AGkzBsovwssT0bq.pdf
(1 row)

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2020-10-14
    • 2019-11-20
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2015-11-28
    相关资源
    最近更新 更多