在 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_entries
和 element_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
的列)
我有一个从不同来源获取数据的查询(多个 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_entries
和 element_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
的列)