
本文介绍如何通过一行正则表达式精准移除 sql 查询字符串中所有 `as alias_name` 形式的列别名,保留原始表达式结构与逗号分隔格式,适用于动态 sql 处理场景。
在构建动态 SQL 或解析 SELECT 子句时,常需剥离列别名(如 AS DOCUMENTO_MAMA),仅保留原始字段或表达式。手动 split('AS') 易出错——它会破坏嵌套括号、字符串字面量(如 ' ' || SPMAMA.NOMBRE2)及跨行结构,且无法区分关键字 AS 与普通文本。
推荐使用不破坏语义的正则替换方案:
const sql = `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 cleanSql = sql.replace(/\s+as\s+[^\s,]+/ig, '');
console.log(cleanSql);
// 输出:
// 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,]+ —— 匹配连续的非空白、非逗号字符(即别名本身,如 DOCUMENTO_MAMA),自动终止于逗号或换行前的空格,不会吞掉后续逗号或换行符;
- /ig —— i 表示忽略大小写(兼容 AS / as / As),g 表示全局替换(处理所有列)。
⚠️ 注意事项:
- 该正则假设别名不含空格或逗号(符合 SQL 标准命名规范);若存在带引号的别名(如 AS "My Column"),需升级为更复杂的解析器(如 SQL 解析库);
- 原始换行与缩进被完整保留,仅删除 AS + 别名 部分,确保结果仍为合法、可读的 SQL 片段;
- 若需进一步清理多余空白(如 , → ,),可追加 .replace(/\s*,\s*/g, ', ')。
此方法简洁、高效、无依赖,是前端预处理 SQL 字符串的首选实践。










