鉴于表格
main
:
abc | pqr | 价格 | 郎 |
---|---|---|---|
你好 | 你好 | 2.34 | en_de |
世界 | 世界 | 1.23 | en_de |
咖啡 | 咖啡厅 | 9.23 | en_fr |
还有一张看起来像这样的地图:
with mappings AS (
SELECT MAP (
ARRAY['en_fr', 'en_de'],
ARRAY['1', '2']
) AS lang2idx
)
目标是提取一个表,其中输出
abc | pqr | 郎 | 指数 |
---|---|---|---|
你好 | 你好 | en_de | 2 |
世界 | 世界 | en_de | 2 |
咖啡 | 咖啡厅 | en_fr | 1 |
我试过这个,它从映射中获取我需要的索引 id:
with mappings AS (
SELECT MAP (
ARRAY['en_fr', 'en_de'],
ARRAY['1', '2']
) AS lang2idx
)
SELECT lang2idx['en_fr'] FROM mappings
我尝试从不同的表中进行一些选择,有点乱七八糟,它抛出语法错误:
SELECT abc, pqr, lang, (lang2idx[lang] FROM MAPPINGS) FROM main
如何从表和映射中进行选择以产生上述所需的输出?
您可以使用以下查询:
WITH mappings AS (
SELECT MAP (
ARRAY['en_fr', 'en_de'],
ARRAY['1', '2']
) AS lang2idx
),
indexed_main AS (
SELECT
abc,
pqr,
lang,
lang2idx[lang] AS index
FROM
main
JOIN mappings ON mappings.lang2idx.keys[array_position(mappings.lang2idx.keys, main.lang)] = main.lang
)
SELECT
abc,
pqr,
lang,
index
FROM
indexed_main;
就我个人而言,我会选择“简单”的 CTE 并加入。沿着这些线的东西:
with mappings (lang, index) AS (
values ('en_fr', '1'),
('en_de', '2')
)
SELECT m.*, mm.index
FROM main m
LEFT JOIN mappings mm on mm.lang = m.lang
如果你想保持原来的CTE不变,你可以使用unnest:
WITH mappings AS (
SELECT MAP (
ARRAY['en_fr', 'en_de'],
ARRAY['1', '2']
) AS lang2idx
),
unnested as (
SELECT t.*
FROM mappings,
unnest (lang2idx) as t(lang, index)
)
SELECT m.*, mm.index
FROM main m
LEFT JOIN unnested mm on mm.lang = m.lang