sql - 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,并且上面的表达式抛出错误。
谁能帮我解决这个问题?
解决方案
当数组的元素是 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)
推荐阅读
- android - 如何从通用方法调用我的片段?
- phpmyadmin - 我可以在 sakila 演示数据库 (phpmyadmin) 中将 SQL 字体放大吗?
- python-3.x - 编辑 Python Gui
- apache-kafka - kafka 如何处理对同一代理上的多个分区的写入,而不会随着磁盘寻道的发生而减慢速度
- yocto - 我可以在 thud meta-tegra 分支中使用 meta-tegra master 分支的 cuda 文件夹吗?
- ios - 如何将未发布的 iOS 应用程序移至另一个同名帐户?
- java - 如何减少 Firestore 集合中的读取次数?
- macos - 如何让Brew在安装前显示公式的大小?
- vuejs2 - 在 VueJS 中构建后扩展 env 变量
- python - 如何从在云控制台上创建的服务帐户访问与我的 client_email 共享的 google 表格