Home > front end >  Create a hardcoded "mapping table" in Trino SQL
Create a hardcoded "mapping table" in Trino SQL

Time:04-28

I have a query (several CTEs) that get data from different sources. The output has a column name, but I would like to map this nameg to a more user-friendly name.

Id name
1 buy
2 send
3 paid

I would like to hard code somewhere in the query (in another CTE?) a mapping table. Don't want to create a separate table for it, just plain text.

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

So output table would be:

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

In Trino I see the function map_from_entries and element_at, but don't know if they could work in this case.

I know "case when" might work, but if possible, a mapping table would be more convenient.

Thanks

CodePudding user response:

Super interesting idea, and I think I got it working:

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

Output:

name
Item purchased
Parcel in transit
Charge processed

To see a bit more of what's happening, we can look at:

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

I'm not sure how efficient this is, but it's certainly an interesting idea.

  • Related