如何使用表中的列之一作为键从表中进行选择和映射?

问题描述 投票:0回答:2

鉴于表格

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

如何从表和映射中进行选择以产生上述所需的输出?

sql arrays dictionary select amazon-athena
2个回答
0
投票

您可以使用以下查询:

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;

0
投票

就我个人而言,我会选择“简单”的 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 
© www.soinside.com 2019 - 2024. All rights reserved.