AWS Athena正则替换:保留首个下划线替换其余为空格及函数报错问题
AWS Athena 下划线替换及REGEXP_REPLACE报错解决
一、REGEXP_REPLACE报错原因及修正
你遇到的函数未找到报错,是因为参考的是MySQL风格的REGEXP_REPLACE参数格式,而AWS Athena基于Presto/Trino,函数参数逻辑不同:
- 错误语法(MySQL风格):
REGEXP_REPLACE('the fox', 'FOX', 'quick brown fox', 1, 'i')(多了起始位置参数,flags位置错误) - Athena正确语法:
SELECT REGEXP_REPLACE('the fox', 'FOX', 'quick brown fox', 'i');
Athena的REGEXP_REPLACE参数为:REGEXP_REPLACE(输入字符串, 匹配模式, 替换值[, 匹配标记]),标记参数(如i表示忽略大小写)是可选的字符串,不需要单独的起始位置参数。
二、实现「保留第一个下划线,其余替换为空格」的方案
针对你的需求,提供两种可行的SQL写法:
方案1:拆分拼接法(逻辑直观)
通过SPLIT_PART拆分第一个下划线前后的内容,替换后半部分的下划线后再拼接:
SELECT CASE -- 处理不含下划线的字符串,避免拼接空值 WHEN col_name NOT LIKE '%_%' THEN col_name ELSE CONCAT( SPLIT_PART(col_name, '_', 1), '_', REGEXP_REPLACE(SPLIT_PART(col_name, '_', 2), '_', ' ') ) END AS processed_col FROM your_table;
- 说明:
SPLIT_PART(col_name, '_', 1)提取第一个下划线前的内容,SPLIT_PART(col_name, '_', 2)提取第一个下划线后的所有内容,再把后半部分的下划线替换为空格,最后拼接成结果。
方案2:正则表达式一次性替换(更简洁)
利用正向预查正则,匹配第一个下划线之后的所有下划线并替换:
SELECT REGEXP_REPLACE(col_name, '(?<=_.*)_', ' ') AS processed_col FROM your_table;
- 正则逻辑:
(?<=_.*)是正向预查,确保当前匹配的下划线前面已经出现过至少一个下划线(即不是第一个下划线),然后将这类下划线替换为空格。 - 优势:无需额外判断,不含下划线的字符串会原样返回。
测试结果
针对你的示例输入:
| 原字符串 | 处理后结果 |
|---|---|
| hel_some_data | hel_some data |
| h_some_data_more_data | h_some data more data |
| hello_some_more_data_data | hello_some more data data |
内容的提问来源于stack exchange,提问作者Md. Parvez Alam
相关产品推荐
相关产品推荐

