You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:21:01