【发布时间】: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