本文介绍如何通过一行正则表达式精准移除 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+("[^"]*"|\[[^\]]*\]|[^\s,]+)/ig此方法简洁、高效、零依赖,适用于大多数 SQL 列别名清洗需求,是处理字符串级 SQL 转换的实用技巧。