[英]How to concat values without NULL results (Snowflake)
我试图在雪花中连接不是 null 值。
我当前的代码:
CONCAT(
CASE WHEN Red='TRUE' THEN 'Red, ' ELSE '' END ||
CASE WHEN Blue='TRUE' THEN 'Blue, ' ELSE '' END ||
CASE WHEN Black='TRUE' THEN 'Black, ' ELSE '' END ||
CASE WHEN White='TRUE' THEN 'White, ' ELSE '' END)
Return:
Red, White, Black,
Black,
...
Want:
Red, White, Black
Black
在 Mysql 中,我会使用 Concat_WS,但在 Snowflake 中,如果一个值为 NULL,NULL 将返回:
CONCAT_WS(', ',
CASE WHEN Red='TRUE' THEN 'Red' ELSE NULL END,
CASE WHEN Blue='TRUE' THEN 'Blue' ELSE NULL END,
CASE WHEN Black='TRUE' THEN 'Black' ELSE NULL END,
CASE WHEN White='TRUE' THEN 'White' ELSE NULL END)
有点晚了,但我遇到了同样的问题并找到了不同的解决方案:
正如之前正确指出的那样,当CONCAT
和WS_CONCAT
的任何参数为NULL
时,它们总是返回NULL
。
但是,由于 Snowflake 具有ARRAY
的概念(即支持半结构化数据),即我们可以执行以下操作:
array_construct
将原始值收集到一个数组中array_compact
从数组中删除NULL
值array_to_string
将剩余的数组项连接成一个字符串这是修改代码,使用 arrays:
select array_to_string(array_compact(array_construct(
CASE WHEN Red = 'TRUE' THEN 'Red' ELSE NULL END,
CASE WHEN Blue = 'TRUE' THEN 'Blue' ELSE NULL END,
CASE WHEN Black = 'TRUE' THEN 'Black' ELSE NULL END,
CASE WHEN White = 'TRUE' THEN 'White' ELSE NULL END)), ', ') as result
FROM values
( true, true, false, false ),
( true, false, false, true ),
( false, false, true, false ),
( false, true, false, true ),
( true, true, true, true )
v(red,blue,black,white);
编辑:您还可以使用array_construct_compact
,它是array_construct
和array_compact
的浓缩版本
您可以使用 RTRIM 删除结束逗号:
select RTRIM(CONCAT(
CASE WHEN Red = 'TRUE' THEN 'Red, ' ELSE '' END,
CASE WHEN Blue = 'TRUE' THEN 'Blue, ' ELSE '' END,
CASE WHEN Black = 'TRUE' THEN 'Black, ' ELSE '' END,
CASE WHEN White = 'TRUE' THEN 'White, ' ELSE '' END ),', ' ) result
FROM values
( true, true, false, false ),
( true, false, false, true ),
( false, false, true, false ),
( false, true, false, true ),
( true, true, true, true )
v(red,blue,black,white);
+-------------------------+
| RESULT |
+-------------------------+
| Red, Blue |
| Red, White |
| Black |
| Blue, White |
| Red, Blue, Black, White |
+-------------------------+
您还可以考虑使用 NULLIF function 将空字符串转换为 NULL:
select NULLIF( RTRIM(CONCAT(
CASE WHEN Red = 'TRUE' THEN 'Red, ' ELSE '' END,
CASE WHEN Blue = 'TRUE' THEN 'Blue, ' ELSE '' END,
CASE WHEN Black = 'TRUE' THEN 'Black, ' ELSE '' END,
CASE WHEN White = 'TRUE' THEN 'White, ' ELSE '' END ),', ' ), '' )result
FROM values
( false, false, false, false )
v(red,blue,black,white);
我知道您的表达式完全符合您的要求,但您需要删除结尾的逗号。 您可以为此使用TRIM()
:
TRIM(', ' FROM
CASE WHEN Red = 'TRUE' THEN 'Red, ' ELSE '' END
|| CASE WHEN Blue = 'TRUE' THEN 'Blue ' ELSE '' END
|| CASE WHEN Black = 'TRUE' THEN 'Black, ' ELSE '' END
|| CASE WHEN White = 'TRUE' THEN 'White, ' ELSE '' END
)
请注意,同时使用||
是没有意义的。 和CONCAT()
:我删除了周围的CONCAT()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.