>),sql,presto,trino"/>

首页 > 解决方案 > Presto 将值插入到 (array>)

问题描述

我有一个类型为“col2”的列

array<struct<pos:int, date:string>>

我需要检查列是否为空,然后将值插入列,然后取消嵌套列中的值

case WHEN CARDINALITY(col2) = 0 THEN ARRAY[(0,'value1'),(0,'value2')] else col2 end as col2

下面是sql

WITH CTE AS 
    (SELECT 
        col1,
        case 
          WHEN CARDINALITY(col2) = 0 THEN ARRAY[(0,'value1'),(0,'value2')]
          else col2
        end as col2
        FROM table1
)
    SELECT 
    col1
    column2.value1 AS pos,
    column2.value2 AS date,
FROM CTE
CROSS JOIN UNNEST(col2) AS t(column2)

因为 case 表达式返回 [{field1=1,field2=2020-03-01},{field1=1,field2=2020-01-09}] 我无法将其解压缩为 value1 和 value2,并且上面的表达式抛出错误。

谁能帮我解决这个问题?

标签: sqlprestotrino

解决方案


当数组的元素是 typerow时,UNNEST将它们展开为单独的列。您需要调整UNNEST子句以反映这一点。

这是一个示例(使用 Trino 351 测试,以前称为 Presto SQL):

WITH
data(entries) AS (VALUES
    ARRAY[],
    ARRAY[(1,'x'),(2,'y')]
),
cte(entries) AS (
    SELECT if(cardinality(entries) = 0, ARRAY[(0,'value1'),(0,'value2')], entries)
    FROM data
)
SELECT pos, date
FROM cte
CROSS JOIN UNNEST(entries) AS t(pos, date)

推荐阅读