如何简化SQL查询:提取含'completed'/'incomplete'值的所有列
简洁筛选目标列的实用思路
嘿,手动列180个列名确实太反人类了!我之前处理过类似的宽表需求,完全懂这种痛苦。核心思路是利用数据库的系统元数据表自动生成查询语句,不用手动敲一堆列名。下面给你分几种常见数据库场景讲具体做法:
通用核心逻辑
先从数据库的系统信息表中,筛选出可能存储'completed'/'incomplete'的列(一般是字符串类型,排除日期、ID这类数值/日期型列),然后自动拼接成查询语句,避免手动重复劳动。
1. MySQL/MariaDB 场景
首先运行这个查询,获取所有字符串类型的列名(自动排除日期、ID等不符合的列):
SELECT GROUP_CONCAT(column_name SEPARATOR ', ') FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '你的表名' AND data_type IN ('char', 'varchar', 'text'); -- 匹配所有字符串类型列
把查询返回的列名列表复制到下面的SELECT语句中,就能快速筛选出包含目标值的行:
SELECT [上面得到的列名列表] FROM 你的表名 WHERE CONCAT_WS(',', [上面得到的列名列表]) REGEXP 'completed|incomplete';
如果想要更精准的每列检查(比如只要某一列有目标值就返回),可以用动态SQL自动生成OR条件,不过上面的方法已经足够简洁。
2. PostgreSQL 场景
用string_agg函数自动拼接列名:
SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_schema = 'public' -- 你的schema名,默认是public AND table_name = '你的表名' AND data_type IN ('character varying', 'character', 'text');
如果想一步到位生成并执行查询,可以用动态SQL块:
DO $$ DECLARE cols text; where_clause text; BEGIN -- 获取目标列名 SELECT string_agg(column_name, ', ') INTO cols FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '你的表名' AND data_type IN ('character varying', 'character', 'text'); -- 生成每列的IN条件 SELECT string_agg(format('%I IN (%L, %L)', column_name, 'completed', 'incomplete'), ' OR ') INTO where_clause FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '你的表名' AND data_type IN ('character varying', 'character', 'text'); -- 执行动态查询 EXECUTE format('SELECT %s FROM 你的表名 WHERE %s', cols, where_clause); END $$;
3. SQL Server 场景
用STRING_AGG和系统表sys.columns来实现:
DECLARE @cols NVARCHAR(MAX), @where NVARCHAR(MAX), @sql NVARCHAR(MAX); -- 获取目标列名和WHERE条件 SELECT @cols = STRING_AGG(name, ', '), @where = STRING_AGG(QUOTENAME(name) + ' IN (''completed'', ''incomplete'')', ' OR ') FROM sys.columns WHERE object_id = OBJECT_ID('你的表名') AND system_type_id IN (167, 175, 231, 239); -- 对应varchar、char、nvarchar等字符串类型 -- 拼接并执行SQL SET @sql = 'SELECT ' + @cols + ' FROM 你的表名 WHERE ' + @where; EXEC sp_executesql @sql;
额外小技巧
如果不确定哪些列是字符串类型,也可以先写个简单的动态查询,检查每一列是否存在'completed'或'incomplete'值,精准定位目标列后再生成筛选语句——不过上面按类型筛选的方法,已经能覆盖大部分场景了。
内容的提问来源于stack exchange,提问作者user9296546
相关产品推荐
相关产品推荐

