如何快速查询表中除expr_前缀列外的所有列?
问题
我有一张包含约50列的数据表,其中有5列的名称以expr_开头。我希望获取除这些expr_开头列之外的所有列,能否无需逐一指定所需列来快速实现?
我想使用类似这样的简洁语句(不用逐个列名):
SELECT * FROM TABLE WHERE column_name NOT LIKE '%EXPR%'
而不是这种需要逐一列出所有列名的写法:
SELECT a, b, c, d, e, f, g, h, .... FROM table
解决方案
SQL本身没有直接支持SELECT *排除指定列的语法,你示例里的写法是错误的——WHERE子句是用来过滤行数据,而非筛选列。不过可以通过查询系统表动态生成目标列名列表,再组装成查询语句,以下是主流数据库的实现方法:
MySQL/MariaDB
查询系统表生成排除expr_开头列的列名拼接字符串:
SELECT GROUP_CONCAT(column_name SEPARATOR ', ') FROM information_schema.columns WHERE table_schema = '你的数据库名称' AND table_name = '你的表名称' AND column_name NOT LIKE 'expr\_%';
执行后复制输出的列名串,替换到SELECT语句中即可完成查询。
SQL Server
通过系统视图生成目标列名:
SELECT STRING_AGG(name, ', ') FROM sys.columns WHERE object_id = OBJECT_ID('你的数据库名.dbo.你的表名') AND name NOT LIKE 'expr_%';
将结果中的列名列表粘贴到SELECT后,就能得到排除指定列的查询语句。
PostgreSQL
利用information_schema和字符串聚合函数生成列名:
SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_schema = 'public' -- 你的模式名,默认通常为public AND table_name = '你的表名称' AND column_name NOT LIKE 'expr_%';
复制生成的列名到SELECT语句中,即可实现需求。
进阶技巧
如果需要频繁执行这类排除列的查询,可以把上述生成逻辑封装成存储过程或函数,每次调用直接获取目标列名列表,进一步简化操作。
内容的提问来源于stack exchange,提问作者takotsubo
相关产品推荐
相关产品推荐

