避免在 Presto 中多次计算相同的值

Avoid computing same value multiple times in Presto

样本Table:

╔═══════════════╗
║ dummy_data    ║
╠═══════════════╣
║ XXX_1234_YYYY ║
║ XXX_5678_YYYY ║
║ XXX_9101_YYYY ║
╚═══════════════╝

期望的输出:

╔═══════════════╦═════════════╦═════════════╗
║  dummy_data   ║ with_prefix ║ with_suffix ║
╠═══════════════╬═════════════╬═════════════╣
║ XXX_1234_YYYY ║ Pre_1234    ║ 1234_Suf    ║
║ XXX_5678_YYYY ║ Pre_5678    ║ 5678_Suf    ║
║ XXX_9101_YYYY ║ Pre_9101    ║ 9101_Suf    ║
╚═══════════════╩═════════════╩═════════════╝

目前我正在尝试编写 Presto Query 以在 Amazon Athena

上使用
select
    dummy_data,
    'Pre_' || split(dummy_data,'_')[2] as with_prefix,
    split(dummy_data,'_')[2] || '_Suf' as with_suffix
from dummy_table

上述查询导致 split(dummy_data,'_')[2] 被计算两次。是否有办法避免双重计算? Presto 是否也发现它是相同的计算并避免重新计算?

我试图避免使用 子查询With 子句

目前 Presto 没有 de-decuplicate sub-expression 计算。我为此创建了功能请求:https://github.com/prestosql/presto/issues/1070。 您可以通过检查 EXPLAIN 输出看到表达式被多次求值(例如参见问题)。

如您所知,您可以使用内联视图强制 de-duplication:

SELECT
    dummy_data,
    'Pre_' || sub_data  AS with_prefix,
    sub_data || '_Suf' AS with_suffix
FROM (
    SELECT
        dummy_data, 
        split(dummy_data,'_')[2] AS sub_data
    FROM (VALUES 'XXX_1234_YYYY') t(dummy_data)
);