[英]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.