首页 > 解决方案 > 如何在没有 NULL 结果的情况下连接值(Snowflake)

问题描述

我正在尝试在雪花中连接非空值。

我当前的代码:

            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 将在 Return 中:

            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)

标签: sqlstringconcatsnowflake-cloud-data-platform

解决方案


有点晚了,但我遇到了同样的问题并找到了不同的解决方案:

正如之前正确指出的那样,CONCAT当他们的任何参数是时WS_CONCAT总是返回。NULLNULL

但是,由于 Snowflake 有ARRAYs 的概念(即支持半结构化数据),即我们可以这样做:

  1. 将原始值收集到一个数组中array_construct
  2. 从数组中删除NULLarray_compact
  3. 用于array_to_string将剩余的数组项连接成一个字符串

这是使用数组的修改代码:

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


推荐阅读