繁体   English   中英

从 JSON 中提取与列值匹配的值

[英]Extract value from JSON that matches a column value

我有以下问题。 我有一张如下表,其中包含所有货币每天的所有汇率(因为基础货币是欧元):

ID 费率值 rate_date
1 {“AED”:2.835349,“AFN”:67.743417,... 2022 年 1 月 1 日
2 {“AED”:2.485349,“AFN”:66.843814, 2-2-2022

列 rate_values 在 JSON 中。 我有另一张表,如下所示:

货币 成本 date_of_sale
自动体外除颤器 150 2022 年 1 月 1 日
AFN 250 2-2-2022
欧元 56 2-2-2022

我在日期加入了这两张桌子。 作为下一步,我想从 rates_values 列中提取货币列上引用的值,但我不知道如何。 理想的结果如下:

货币 extract_values_for_each_sale
自动体外除颤器 2.835349
AFN 66.843814
欧元 1

我可以写一个很长的 CASE...WHEN... 语句,每次都提取匹配值,但这不是最佳解决方案。

这可以通过在获得适当的速率时将列用作 JSON 键来简单地实现:

(rates_values->currency)::float

(货币是问题第二个表中的列)。

您可以首先像这样规范化(或展平)汇率表( exchange_rates CTE 是真实表的模仿):

with exchange_rates(id, rates_values, rate_date) as
(
 values
 (1, '{"AED":2.835349,"AFN":67.743417,"BGN":1.95582}', '2022-01-01'::date),
 (2, '{"AED":2.485349,"AFN":66.843814,"BGN":1.95582}', '2022-02-02')
)
select xr.id, l.currency, l.rate::numeric, xr.rate_date 
from exchange_rates xr
cross join lateral jsonb_each_text(xr.rates_values::jsonb) as l(currency, rate);
ID 货币 速度 rate_date
1 自动体外除颤器 2.835349 2022-01-01
1 AFN 67.743417 2022-01-01
1 BGN 1.95582 2022-01-01
2 自动体外除颤器 2.485349 2022-02-02
2 AFN 66.843814 2022-02-02
2 BGN 1.95582 2022-02-02

然后根据需要加入它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM