SQL Server中对查询结果应用正则替换的实现方案咨询
嘿,我来帮你搞定这个SQL字段处理的需求!针对你的codi_nivell字段,我们需要分两步完成:先去掉末尾的所有0,再给每两位数字之间加上斜杠分隔。下面我针对几种主流数据库给出具体的实现方案,你可以根据自己使用的数据库来选择:
MySQL 实现(8.0及以上版本)
MySQL 8.0+支持REGEXP_REPLACE正则替换函数,结合TRIM就能轻松实现需求:
SELECT REGEXP_REPLACE( TRIM(TRAILING '0' FROM codi_nivell), '\\d{2}(?=(?:\\d{2})+$)', '$0/' ) AS formatted_codi_nivell FROM anc_documents;
TRIM(TRAILING '0' FROM codi_nivell):专门去掉字段值末尾的所有0,比如你的示例数据06080100000000会被处理成060801。REGEXP_REPLACE里的正则\\d{2}(?=(?:\\d{2})+$)用正向预查匹配每两位数字,且要求后面还有偶数位数字(保证最后一组不会多加分隔符),替换成$0/就是把匹配到的两位数字后面加个斜杠,最终060801会变成06/08/01。
PostgreSQL 实现
PostgreSQL同样支持REGEXP_REPLACE,语法和MySQL略有区别,主要是捕获组的引用符号:
SELECT REGEXP_REPLACE( TRIM(TRAILING '0' FROM codi_nivell), '\d{2}(?=(?:\d{2})+$)', '\0/' ) AS formatted_codi_nivell FROM anc_documents;
- 去末尾0的逻辑和MySQL一致,都是
TRIM(TRAILING '0' FROM codi_nivell)。 - PostgreSQL里引用整个匹配内容用
\0而不是$0,所以替换部分写成'\0/',最终效果和MySQL完全一样。
Oracle 实现
Oracle用RTRIM来去掉末尾的0,正则替换的语法也需要调整捕获组的写法:
SELECT REGEXP_REPLACE( RTRIM(codi_nivell, '0'), '(\d{2})(?=(?:\d{2})+$)', '\1/' ) AS formatted_codi_nivell FROM anc_documents;
RTRIM(codi_nivell, '0'):作用和前面的TRIM一致,去掉字段末尾的所有0。- Oracle的正则需要把匹配的两位数字用括号
()捕获,然后用\1来引用这个捕获组,替换成'\1/'就能实现每两位加分隔符的效果。
特殊情况说明
如果去掉末尾0后剩下的数字位数是奇数(比如原数据是0608010,处理后是060801,偶数位没问题;如果是06080,处理后是0608,会变成06/08;如果是060,处理后是06,不会加分隔符),这种逻辑是符合正则预期的,因为最后一组后面没有足够的两位数字,正则不会匹配它。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

