【问题标题】:Rails & Postgres selecting sub keys of a JSONB columnRails & Postgres 选择 JSONB 列的子键
【发布时间】:2021-06-28 19:32:43
【问题描述】:

我有一个JSONB 类型的数据库表列,我想从该列中获取一些数据。对于大部分部分,该列是键\值对的平面列表。

例如:

{ s_key: 'value', s_key1: 'value', s_key2: 'value' ...etc }

但是,我需要的密钥包含 JSON 数据数组(或者可以是 null/nil):

key: [ {first_name: 'Hugo', last_name: 'Grant', ind: true }, 
       {first_name: 'Larry', last_name: 'Larson', ind: false },
       {first_name: 'Rick', last_name: 'Flair', ind: 'true' } ]

现在,我想做的是有一个子选择,它根据ind(无论它是否为真/'真')为我提供连接的名称字符串(first_name + last_name)。所以,我想要一个输出:

[ 'Hugo Grant', 'Rick Flair' ]

通过这个 PSQL 片段,我在一定程度上实现了这一点:

    select t.id, array_agg(t._name) as _board
    from (
        select 
            d.id,
            jsonb_extract_path_text(jsonb_array_elements(
                case jsonb_extract_path(d.data, 'board_members') 
                    when 'null' then '[{}]'::jsonb 
                    else jsonb_extract_path(d.data, 'board_members') 
                end
            ), 'first_name') || ' ' || jsonb_extract_path_text(jsonb_array_elements(
                case jsonb_extract_path(d.data, 'board_members') 
                    when 'null' then '[{}]'::jsonb 
                    else jsonb_extract_path(d.data, 'board_members') 
                end
            ), 'last_name') as _name
        from my_table d
        group by d.id
    ) t
    group by t.id

有没有办法简化 SQL 语句(以及如何为ind = [true, 'true'] 添加位?

【问题讨论】:

    标签: sql ruby-on-rails psql postgresql-12


    【解决方案1】:
    select
      id,
      array_to_string(
        (
          select
            array_agg(concat_ws(' ', p.item ->> 'first_name', p.item ->> 'last_name'))
          from  jsonb_array_elements(jsonb_path_query_array(d.data, '$.board_members[*] ? (@.bank_employee == true || @.bank_employee == "true")')) as p(item)
        ), ', '
      ) as names
    from my_table d
    

    我通过上述实现了我想要的。以为我会把它扔在这里。

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 2021-02-28
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      相关资源
      最近更新 更多