使用SELECT *语法时指定列别名导致列重复的问题求助
解决SELECT *加别名导致重复列的问题
当你使用SELECT table.a AS 'This is a', * FROM table这类语句时,查询结果会同时返回别名列和原列a,造成列重复。但业务场景中需要保留SELECT *来自动包含新增列,无法通过枚举所有列的方式避免重复。以下是针对不同数据库的可行解决方案:
通用动态SQL方案(适配多数数据库)
通过查询数据库元数据获取表的所有列,排除掉已设置别名的列,再动态拼接SQL语句,既保留别名列,又自动包含新增列,同时避免重复。
MySQL示例
SET @cols = (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '你的表名' AND COLUMN_NAME != 'a'); SET @sql = CONCAT('SELECT a AS ''This is a'', ', @cols, ' FROM 你的表名'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SQL Server示例
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX); SELECT @cols = STRING_AGG(QUOTENAME(COLUMN_NAME), ', ') FROM sys.columns WHERE object_id = OBJECT_ID('你的表名') AND COLUMN_NAME != 'a'; SET @sql = N'SELECT a AS ''This is a'', ' + @cols + N' FROM 你的表名'; EXEC sp_executesql @sql;
特定数据库简化方案
PostgreSQL(12及以上版本)
PostgreSQL支持直接在SELECT *后使用EXCLUDE语法排除指定列,写法更简洁:
SELECT a AS 'This is a', * EXCLUDE (a) FROM "你的表名";
注意事项
- 动态SQL执行需要确保用户拥有查询数据库元数据(如
INFORMATION_SCHEMA或sys.columns)的权限 - 若需给多个列设置别名,只需在排除列表中添加对应的列名即可
- 优先使用数据库原生简化语法(如PostgreSQL的
EXCLUDE),性能和可读性更优
内容的提问来源于stack exchange,提问作者Daimen Rees
相关产品推荐
相关产品推荐

