
本文介绍如何通过一行正则表达式精准移除 sql 查询字符串中所有 `as alias_name` 形式的列别名,保留原始表达式结构,兼容多行、嵌套函数及含空格/引号的复杂字段。
在处理动态 SQL 字符串(如前端拼接或日志解析场景)时,常需剥离 AS alias 别名以获取原始字段表达式。手动 split(‘AS’) 易出错——它会破坏含 AS 的字符串字面量(如 ‘STATUS AS OF’)、函数名(如 ASCiisTR)或注释,且无法准确识别别名边界。
推荐使用带语义边界的正则替换,精准匹配“独立的 AS 关键字 + 后续合法别名”:
const sqlWithAliases = `SPMAMA.DOCUMENTO AS DOCUMENTO_MAMA, NVL(SPMAMA.CARNETSALUS,SPMAMA_N.CARNETSALUS) AS CARNETSALUS_MAMA, NVL(SPMAMA.NOMBRE1 || ' ' || SPMAMA.NOMBRE2 || ' ' || SPMAMA.APELLIDO1 || ' ' || SPMAMA.APELLIDO2, SPMAMA_N.NOMBRE1 || ' ' || SPMAMA_N.NOMBRE2 || ' ' || SPMAMA_N.APELLIDO1 || ' ' || SPMAMA_N.APELLIDO2) AS NOMBRE_MAMA`; const sqlWithoutAliases = sqlWithAliases.replace(/s+ass+[^s,]+/ig, ''); console.log(sqlWithoutAliases); // 输出: // SPMAMA.DOCUMENTO, // NVL(SPMAMA.CARNETSALUS,SPMAMA_N.CARNETSALUS), // NVL(SPMAMA.NOMBRE1 || ' ' || SPMAMA.NOMBRE2 || ' ' || SPMAMA.APELLIDO1 || ' ' || SPMAMA.APELLIDO2, // SPMAMA_N.NOMBRE1 || ' ' || SPMAMA_N.NOMBRE2 || ' ' || SPMAMA_N.APELLIDO1 || ' ' || SPMAMA_N.APELLIDO2)
✅ 正则解析:
- s+ass+ → 匹配一个或多个空白字符 + 不区分大小写的 as + 一个或多个空白字符
- [^s,]+ → 匹配连续非空白、非逗号字符(即别名本身,不跨字段)
- /ig → 全局(g)+ 不区分大小写(i)匹配
⚠️ 注意事项:
- 该方案不处理 AS 出现在字符串字面量内的情况(如 … AS ‘NAME AS VALUE’),因纯正则无法解析 SQL 语法树。若存在此类场景,建议改用专业 SQL 解析器(如 sql-parser 库)。
- 若别名含双引号(如 AS “DOC_ID”)或方括号(SQL Server 风格 AS [DOCUMENTO]),需扩展正则为:
/s+ass+("[^"]*"|[[^]]*]|[^s,]+)/ig - 建议对结果执行 .trim().replace(/s+/g, ‘ ‘) 清理多余空白,提升可读性。
此方法简洁、高效、零依赖,适用于大多数 SQL 列别名清洗需求,是处理字符串级 SQL 转换的实用技巧。