使用二进制结果按列名进行连接



如果为真,我想按照下面的方式连接列名:

输入表:

<表类>IDFlag1Flag2Flag3tbody><<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;
<表类>IDC1C2C3结果tbody><<tr>1flag1空flag3["flag1","flag3")flag1, flag32空flag2flag3["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>1Flag1, Flag32Flag2, 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;

最新更新