如何移除SQL表字段中竖线至分号间的指定字符?
解决方法
针对你需要移除|(包含)到;之间所有字符的需求,最直接的方案是用正则表达式全局替换,不同SQL方言的具体实现如下:
1. MySQL/MariaDB
使用REGEXP_REPLACE函数匹配目标模式并替换:
SELECT REGEXP_REPLACE(your_column, '\|[^;]+', '; ') AS cleaned_keywords FROM your_table;
- 匹配规则:
\|转义匹配竖线,[^;]+匹配竖线后到分号前的所有非分号字符;替换为;后直接得到目标格式。
2. PostgreSQL
同样用REGEXP_REPLACE,需指定全局替换标志'g':
SELECT REGEXP_REPLACE(your_column, '\|[^;]+', '; ', 'g') AS cleaned_keywords FROM your_table;
3. SQL Server
2017及以上版本(支持正则)
SELECT REGEXP_REPLACE(your_column, '\|[^;]+', '; ') AS cleaned_keywords FROM your_table;
旧版本(无正则支持)
通过拆分-截取-拼接实现:
SELECT STRING_AGG(SUBSTRING(split_val, 1, CHARINDEX('|', split_val) - 1), '; ') AS cleaned_keywords FROM your_table CROSS APPLY STRING_SPLIT(your_column, ';') AS split(split_val) WHERE split_val <> '';
- 逻辑:先按
;拆分字符串,对每个片段截取|前的关键词,最后用STRING_AGG拼接成目标格式。
4. Oracle
SELECT REGEXP_REPLACE(your_column, '\|[^;]+', '; ') AS cleaned_keywords FROM your_table;
效果验证
原字符串:
keyword|44500903-8f09-40d8-a908-5fb3e03d145e;keyword2|441fb756-ff0a-473f-ad70-2f78d679e7d9
处理后结果:keyword; keyword2
为什么substring/trim不适用?
你的字符串是重复的键值对模式,substring只能处理固定位置的字符截取,无法批量处理多个重复结构;而正则可以全局匹配所有符合|UUID的片段,一次性完成替换,效率和适用性更高。
内容的提问来源于stack exchange,提问作者Douglas Filipe
相关产品推荐
相关产品推荐

