如果为真,我想按照下面的方式连接列名:
输入表:
<表类>ID Flag1 Flag2 Flag3 tbody><<tr>1 对 假 对 2假 对 对 表类>
将几个命令链接在一起,IFF用于测试列值并生成名称或null, ARRAY_CONSTRUCT_COMPACT用于剥离空值,ARRAY_TO_STRING用于将它们很好地组合在一起。
和对数据使用CTE:
with data(id, flag1, flag2, flag3) as (
select * from values
(1, True, False, True),
(2, False, True, True)
)
select
id
,iff(flag1,'flag1', null) as c1
,iff(flag2,'flag2', null) as c2
,iff(flag3,'flag3', null) as c3
,array_construct_compact(c1,c2,c3) as a
,array_to_string(a, ', ') as result
from data
order by 1;
<表类>ID C1 C2 C3 结果 tbody><<tr>1 flag1 空 flag3 ["flag1","flag3") flag1, flag3 2空 flag2 flag3 ["flag2","flag3") flag2, flag3 表类>
以下使用CASE表达式和CONCAT函数的查询将在snowflake中为您工作。
SELECT
ID,
RTRIM(CONCAT(
CASE WHEN Flag1 THEN 'Flag1, ' ELSE '' END,
CASE WHEN Flag2 THEN 'Flag2, ' ELSE '' END,
CASE WHEN Flag3 THEN 'Flag3, ' ELSE '' END
), ', ') AS Flags
FROM
YourTable;
输出:
<表类>ID 标记 tbody><<tr>1 Flag1, Flag3 2Flag2, Flag3 表类>
您可以像使用LISTAGG函数一样使用CASE语句、CONCAT函数和字符串聚合函数的组合。
下面是一个SQL查询示例:SELECT ID, LISTAGG(CASE
WHEN Flag1 = TRUE THEN 'Flag1'
ELSE NULL
END || ', ' ||
CASE
WHEN Flag2 = TRUE THEN 'Flag2'
ELSE NULL
END || ', ' ||
CASE
WHEN Flag3 = TRUE THEN 'Flag3'
ELSE NULL
END, ', ') WITHIN GROUP (ORDER BY ID) AS Flags
FROM InputTable
GROUP BY ID;