Snowflake中移除最后一段管道分隔内容的SQL实现求助
Snowflake SQL:提取管道分隔字符串除最后一段外的内容
可以用REGEXP_REPLACE结合正则表达式快速实现需求,自动匹配并移除最后一个管道符(含前后可能的空格)及其后的所有内容,无需提前知道管道数量。
核心SQL语句
REGEXP_REPLACE(your_column_name, '\s*\|[^|]*$', '')
正则表达式说明
\s*:匹配0个或多个空格,兼容管道符前带空格或不带空格的情况\|:匹配管道符本身(正则中需转义)[^|]*:匹配任意非管道符的字符(即最后一段的内容)$:锚定到字符串结尾,确保只匹配最后一个管道符及后续内容
完整测试示例
SELECT original_string, REGEXP_REPLACE(original_string, '\s*\|[^|]*$', '') AS trimmed_result FROM ( VALUES ('xxx | YYY | XXX | asda | dasd12 | adasda'), ('32131| Y\ZYY | XXX | asda | dasd12 | 213131 | adsadfd'), ('no_pipe_string'), -- 无管道时返回原字符串 ('a|b|c|d') -- 返回a|b|c ) AS test_data(original_string);
执行后会得到符合预期的结果:
| original_string | trimmed_result |
|---|---|
| xxx | YYY |
| 32131 | Y\ZYY |
| no_pipe_string | no_pipe_string |
| a | b |
备选方案:拆分后聚合(适用于分隔符格式统一的场景)
如果你的管道分隔符格式完全统一(比如都是|),也可以用拆分后聚合的方式:
SELECT original_string, LISTAGG(part, ' | ') WITHIN GROUP (ORDER BY idx) AS trimmed_result FROM ( SELECT original_string, SPLIT_PART(original_string, ' | ', idx) AS part, idx FROM test_data, TABLE(GENERATOR(ROWCOUNT => 100)) -- 生成足够多的行覆盖拆分数量 WHERE SPLIT_PART(original_string, ' | ', idx) != '' QUALIFY idx < COUNT(*) OVER (PARTITION BY original_string) ) GROUP BY original_string;
这个方法通过拆分字符串为多个部分,排除最后一段后重新聚合,但需要确保分隔符格式一致,灵活性不如正则方法。
内容的提问来源于stack exchange,提问作者user7437134
相关产品推荐
相关产品推荐

