英文:
Concat by Column Names using Binary Results
问题
Desired Output Table:
ID | Flags |
---|---|
1 | Flag1, Flag3 |
2 | Flag2, Flag3 |
英文:
I'd like to concat column names if true as per below:
Input Table:
ID | Flag1 | Flag2 | Flag3 |
---|---|---|---|
1 | True | False | True |
2 | False | True | True |
Desired Output Table:
ID | Flags |
---|---|
1 | Flag1, Flag3 |
2 | Flag2, Flag3 |
答案1
得分: 1
以下查询使用了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 | Flags |
---|---|
1 | Flag1, Flag3 |
2 | Flag2, Flag3 |
英文:
The following query using a CASE expression and the CONCAT function shall work for you in 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;
Output :
ID | Flags |
---|---|
1 | Flag1, Flag3 |
2 | Flag2, Flag3 |
As I don't have any free tool to show you demo; I am trying to show you demo here using equivalent query in other database
答案2
得分: 1
以下是翻译好的部分:
所以将一些命令串在一起,IFF 用于测试列的值并生成名称或null,ARRAY_CONSTRUCT_COMPACT 用于去掉null值,以及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 | A | RESULT |
---|---|---|---|---|---|
1 | flag1 | null | flag3 | [ "flag1", "flag3" ] | flag1, flag3 |
2 | null | flag2 | flag3 | [ "flag2", "flag3" ] | flag2, flag3 |
这段代码可以折叠成以下形式:
```sql
select
id
,array_to_string(
array_construct_compact(
iff(flag1,'flag1', null),
iff(flag2,'flag2', null),
iff(flag3,'flag3', null)
)
, ', '
) as flags
from data
order by 1;
得到结果:
ID | FLAGS |
---|---|
1 | flag1, flag3 |
2 | flag2, flag3 |
英文:
so chaining a few commands together, IFF to test the column value and produce the name or null, ARRAY_CONSTRUCT_COMPACT to strip out the null values, and ARRAY_TO_STRING to put it together nicely.
and using a CTE for data:
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 | A | RESULT |
---|---|---|---|---|---|
1 | flag1 | null | flag3 | [ "flag1", "flag3" ] | flag1, flag3 |
2 | null | flag2 | flag3 | [ "flag2", "flag3" ] | flag2, flag3 |
which can be folded up like:
select
id
,array_to_string(
array_construct_compact(
iff(flag1,'flag1', null),
iff(flag2,'flag2', null),
iff(flag3,'flag3', null)
)
, ', '
) as flags
from data
order by 1;
to give:
ID | FLAGS |
---|---|
1 | flag1, flag3 |
2 | flag2, flag3 |
答案3
得分: 0
您可以使用CASE语句、CONCAT函数和字符串聚合函数,就像您可以使用LISTAGG函数一样。
这是一个示例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;
英文:
You can use a combination of the CASE statement, CONCAT function, and string aggregation function like you can use the LISTAGG function.
Here's an example SQL query:
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;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论