Rails & Postgres 选择 JSONB 列的子键

Rails & Postgres selecting sub keys of a JSONB column

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

例如:

{ 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' } ]

现在,我想要做的是有一个子 select,它根据 [=18= 给我连接的名称字符串 (first_name + last_name) ](不管是不是真的/'true')。所以,我想要一个输出:

[ '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'] 添加位?

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

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