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
我通过以上实现了我想要的。以为我会把它扔在这里。
我有一个类型为 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
我通过以上实现了我想要的。以为我会把它扔在这里。