首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >presto - concat列名

presto - concat列名
EN

Stack Overflow用户
提问于 2020-09-15 17:05:28
回答 3查看 274关注 0票数 0

可以将列名连接到一个数组中吗?例如,我的表是:

代码语言:javascript
复制
key|name_changed|address_changed|number_changed
-----------------------------------------------
1  |true        |true           |false

我想要得到:

代码语言:javascript
复制
key|changes
---------------------------------
1  |[name, address]
EN

回答 3

Stack Overflow用户

发布于 2020-09-15 18:43:48

如果你想要一个数组:

代码语言:javascript
复制
select key,
       ((case when name_changed then array['name'] end) ||
        (case when address_changed then array['address'] end) ||
        (case when number_changed then array['number'] end)
       ) as changes

Here是一个使用Postgres的db<>fiddle,它在处理数组方面应该非常类似于Presto。

票数 1
EN

Stack Overflow用户

发布于 2020-09-16 00:20:12

假设您想要一个数组作为输出,您可以通过几种不同的方法来实现。

一种方法是创建一个数组,将每列的标签作为element,如果元素为false,则为NULL。这是通过表达式if(name_changed, 'name')实现的,它是CASE WHEN condition THEN if_true END的简写形式。请注意,如果条件为false,它将返回NULL。要从结果数组中删除空值,请使用带有排除nulls的lambda expressionfilter函数:e -> e is not null

代码语言:javascript
复制
WITH data(key, name_changed, address_changed, number_changed)
AS (values (1, true, true, false))
SELECT 
    key,
    filter(
        array[if(name_changed, 'name'), if(address_changed, 'address'), if(number_changed, 'number')], 
        e -> e is not null) AS changes
FROM data

避免使用filter的另一个选择是为每个标签创建一个数组,然后将它们连接在一起。这与上面的其他答案类似,但请注意,在Presto (和标准SQL)中,如果||操作符的任何参数为NULL,则结果为NULL。要解决此问题,请在条件为false时从每个if表达式返回一个空数组:

代码语言:javascript
复制
WITH data(key, name_changed, address_changed, number_changed)
AS (values (1, true, true, false))
SELECT 
    key,
    if(name_changed, array['name'], array[]) || 
    if(address_changed, array['address'], array[]) || 
    if(number_changed, array['number'], array[]) AS changes
FROM data
票数 1
EN

Stack Overflow用户

发布于 2020-09-15 17:19:34

代码语言:javascript
复制
select  key
            , concat(   case when name_changed = true then 'name' end, ', ',
                        case when address_changed = true then 'address' end, ', ', case when address_changed = true then 'address' end) as changes
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63898560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档