如何在SQL Server中通过OPENQUERY实现手机号掩码?原Oracle代码失效排查
问题排查与SQL Server适配方案
原代码在SQL Server中无法运行,核心原因是Oracle与SQL Server的函数语法、正则规则存在差异,具体问题点及适配方案如下:
关键差异点
- 字符串长度函数:Oracle的
LENGTH()对应SQL Server的LEN() - 正则表达式语法:
- Oracle的标点匹配
[[:punct:]]在SQL Server中需替换为\p{P}(或自定义标点集合) - Oracle的多空格匹配
( ){1,}可简化为SQL Server支持的\s+ - 正则分组替换的引用符号:Oracle用
\1,SQL Server用$1
- Oracle的标点匹配
- 字符串连接:Oracle的
||替换为SQL Server的+ - 引号转义:动态SQL中的四重引号
''''需改为双重引号''(直接执行SQL则用单引号)
适配后的SQL Server代码
CASE WHEN LEN(TRIM(TELNO2)) = '8' THEN REGEXP_REPLACE(REGEXP_REPLACE(TRIM(TELNO1), '\p{P}', ''), '\s+', '') + '-' + REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(TRIM(TELNO2), '\p{P}', ''), '\s+', ''), '(.{4})(.{4})', '$1-****') ELSE REGEXP_REPLACE(REGEXP_REPLACE(TRIM(TELNO1), '\p{P}', ''), '\s+', '') + '-' + REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(TRIM(TELNO2), '\p{P}', ''), '\s+', ''), '(.{3})(.{4})', '$1-****') END AS TelNo, CASE WHEN LEN(TRIM(CELLNO2)) = '8' THEN REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(TRIM(CELLNO1)+TRIM(CELLNO2), '\p{P}', ''), '\s+', ''), '(.{3})(.{4})(.{4})', '$1-$2-****') ELSE REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(TRIM(CELLNO1)+TRIM(CELLNO2), '\p{P}', ''), '\s+', ''), '(.{3})(.{4})(.{4})', '$1-$2-****') END AS CELLNo
注意事项
- 需确保SQL Server版本为2017及以上,低版本不支持
REGEXP_REPLACE函数 - 若需兼容低版本,可使用
REPLACE嵌套替代正则去除标点和空格,用STUFF函数实现掩码逻辑
内容的提问来源于stack exchange,提问作者King Henry
相关产品推荐
相关产品推荐

