
本文介绍如何通过一行正则表达式精准移除 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+as\s+[^\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+as\s+ → 匹配一个或多个空白字符 + 不区分大小写的 as + 一个或多个空白字符
- [^\s,]+ → 匹配连续非空白、非逗号字符(即别名本身,不跨字段)
- /ig → 全局(g)+ 不区分大小写(i)匹配
⚠️ 注意事项:
- 该方案不处理 AS 出现在字符串字面量内的情况(如 ... AS 'NAME AS VALUE'),因纯正则无法解析 SQL 语法树。若存在此类场景,建议改用专业 SQL 解析器(如 sql-parser 库)。
- 若别名含双引号(如 AS "DOC_ID")或方括号(SQL Server 风格 AS [DOCUMENTO]),需扩展正则为:
/\s+as\s+("[^"]*"|\[[^\]]*\]|[^\s,]+)/ig - 建议对结果执行 .trim().replace(/\s+/g, ' ') 清理多余空白,提升可读性。
此方法简洁、高效、零依赖,适用于大多数 SQL 列别名清洗需求,是处理字符串级 SQL 转换的实用技巧。










