如何在phpMyAdmin中查询时排除指定列(无需枚举其余列)?
解决方案:排除指定列查询所有其他列
这绝对是日常开发中会遇到的痛点——当表的列数多到数不过来的时候,手动写SELECT column2, column3, ...简直是噩梦。好在我们可以利用数据库的系统元数据表来动态生成查询语句,不用手动罗列所有列。
下面针对主流数据库分别给出实现方案:
MySQL/MariaDB
利用information_schema.columns表获取列名,排除目标列后拼接成查询语句:
-- 替换your_table为你的表名 SET @cols = (SELECT GROUP_CONCAT(column_name SEPARATOR ', ') FROM information_schema.columns WHERE table_schema = DATABASE() -- 当前数据库 AND table_name = 'your_table' AND column_name != 'column1'); -- 要排除的列 SET @sql = CONCAT('SELECT ', @cols, ' FROM your_table'); -- 执行动态SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
注意:如果你的列名包含特殊字符(比如空格、关键字),可以用
CONCAT('', column_name, '')来包裹列名,避免语法错误。
PostgreSQL
PostgreSQL可以用string_agg函数拼接列名,结合EXECUTE执行动态SQL:
-- 替换your_table为你的表名,public是默认schema,根据实际情况修改 DO $$ DECLARE cols text; BEGIN SELECT string_agg(quote_ident(column_name), ', ') INTO cols FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'your_table' AND column_name != 'column1'; EXECUTE format('SELECT %s FROM your_table', cols); END $$;
quote_ident会自动处理特殊列名,给列名加上双引号,避免因列名冲突导致的语法问题,非常实用。
SQL Server
使用sys.columns系统视图和STRING_AGG函数(SQL Server 2017及以上支持):
-- 替换your_table为你的表名 DECLARE @cols NVARCHAR(MAX); DECLARE @sql NVARCHAR(MAX); SELECT @cols = STRING_AGG(QUOTENAME(column_name), ', ') FROM sys.columns WHERE object_id = OBJECT_ID('your_table') AND column_name != 'column1'; SET @sql = N'SELECT ' + @cols + N' FROM your_table'; EXEC sp_executesql @sql;
如果是SQL Server 2016及更早版本,没有STRING_AGG的话,可以用FOR XML PATH来拼接列名:
DECLARE @cols NVARCHAR(MAX); DECLARE @sql NVARCHAR(MAX); SELECT @cols = STUFF((SELECT ', ' + QUOTENAME(column_name) FROM sys.columns WHERE object_id = OBJECT_ID('your_table') AND column_name != 'column1' FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ''); SET @sql = N'SELECT ' + @cols + N' FROM your_table'; EXEC sp_executesql @sql;
总结
本质上都是通过查询数据库的元数据获取列列表,排除不需要的列后动态生成SELECT语句。这种方法的好处是不管表后续新增多少列,都不需要修改查询语句,灵活性拉满。
内容的提问来源于stack exchange,提问作者Tri Bagus
相关产品推荐
相关产品推荐

