sql - 如何在没有 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)
解决方案
有点晚了,但我遇到了同样的问题并找到了不同的解决方案:
正如之前正确指出的那样,CONCAT
当他们的任何参数是时WS_CONCAT
总是返回。NULL
NULL
但是,由于 Snowflake 有ARRAY
s 的概念(即支持半结构化数据),即我们可以这样做:
- 将原始值收集到一个数组中
array_construct
- 从数组中删除
NULL
值array_compact
- 用于
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
推荐阅读
- c# - 在 Azure Functions v2 上使用 MySqlDatabase (MySql.Data.MySqlClient) -“无法解析服务”
- php - WordPress 数据库错误 INSERT 命令拒绝用户“只读”
- swift - SwiftUI 双导航栏
- sql - 根据日期将值从一个表添加到另一个表
- amazon-web-services - 如何在融合云中配置 SourceConnector?
- python - 删除级联总是导致与外键约束冲突
- javascript - 消除
来自目标 C 中的 WKwebview - mysql - 更改特定列中的填充表数据类型
- r - R中组的聚合和排名
- sap-cloud-sdk - Oauth2ClientCredentials - 目标服务返回错误:未授权客户端