concat columns names



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

key|name_changed|address_changed|number_changed
-----------------------------------------------
1  |true        |true           |false

我想得到:

key|changes
---------------------------------
1  |[name, address]

如果您想要一个数组:

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

这里有一个db<gt;fiddle使用Postgres,在处理数组方面应该与Presto非常相似。

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

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

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表达式返回一个空数组:

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
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

相关内容

  • 没有找到相关文章

最新更新