在 Trino SQL 中创建硬编码 "mapping table"

Create a hardcoded "mapping table" in Trino SQL

我有一个从不同来源获取数据的查询(多个 CTE)。输出有一列 name,但我想将此名称映射到更用户友好的名称。

Id name
1 buy
2 send
3 paid

我想在查询的某处(在另一个 CTE 中?)硬编码一个映射 table。不想为其创建单独的 table,只是纯文本。

name_map=[('buy','Item purchased'),('send','Parcel in transit'),('paid','Charge processed')]

所以输出 table 将是:

Id name
1 Item purchased
2 Parcel in transit
3 Charge processed

在 Trino 中,我看到函数 map_from_entrieselement_at,但不知道它们是否适用于这种情况。

我知道“case when”可能有用,但如果可能的话,映射 table 会更方便。

谢谢

超级有趣的想法,我想我成功了:

with tmp as (
    SELECT * 
    FROM (VALUES ('1', 'buy'),
                  ('2', 'send'),
                  ('3', 'paid')) as t(id, name)
)
SELECT element_at(name_map, name) as name
FROM tmp
JOIN (VALUES map_from_entries(
    ARRAY[('buy', 'Item purchased'),
          ('send', 'Parcel in transit'),
          ('paid', 'Charge processed')])) as t(name_map) ON TRUE

输出:

name
Item purchased
Parcel in transit
Charge processed

要进一步了解正在发生的事情,我们可以查看:

SELECT *, element_at(name_map, name) as name
id name name_map name
1 buy {buy=Item purchased, paid=Charge processed, send=Parcel in transit} Item purchased
2 send {buy=Item purchased, paid=Charge processed, send=Parcel in transit} Parcel in transit
3 paid {buy=Item purchased, paid=Charge processed, send=Parcel in transit} Charge processed

我不确定这有多有效,但这确实是一个有趣的想法。

作为其他答案的更简单替代方案,您实际上不需要使用 map_from_entries 创建中间映射并使用 element_at 查找值。您可以使用 VALUES 创建内联映射 table 并使用常规 JOIN 进行查找:

WITH mapping(name, description) AS (
    VALUES
        ('buy', 'Item purchased'),
        ('send', 'Parcel in transit'),
        ('paid', 'Charge processed')
)
SELECT description
FROM t JOIN mapping ON t.name = mapping.name

(查询假定您的数据位于名为 t 的 table 中,其中包含用于查找的名为 name 的列)