SQL中能否按列名的子串匹配来筛选并选择列?
嘿,这个需求我之前也碰到过!可惜SQL本身并没有直接支持SELECT * LIKE '%Points%'这种直接按列名子串筛选的语法,不过咱们可以通过查询数据库的系统元数据来动态生成需要的查询语句,下面分几种常用数据库给你具体的实现办法:
MySQL/MariaDB
你可以查询information_schema.columns这个系统表来获取符合条件的列名,然后拼接成完整的查询语句:
SELECT CONCAT('SELECT ', GROUP_CONCAT(column_name SEPARATOR ', '), ' FROM your_table;') FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '目标表名' AND column_name LIKE '%Points%';
执行这条语句后,你会得到一条拼接好的SELECT语句,把这条语句复制出来执行,就能只拿到列名包含Points的那些列了。如果想一步自动执行,还可以用动态SQL:
SET @sql = ( SELECT CONCAT('SELECT ', GROUP_CONCAT(column_name SEPARATOR ', '), ' FROM your_table;') FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '目标表名' AND column_name LIKE '%Points%' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL
PostgreSQL同样可以借助information_schema.columns来实现,用string_agg函数拼接列名:
SELECT 'SELECT ' || string_agg(column_name, ', ') || ' FROM your_table;' FROM information_schema.columns WHERE table_schema = 'public' -- 通常默认schema是public,根据你的实际情况调整 AND table_name = '目标表名' AND column_name LIKE '%Points%';
拿到生成的SQL后执行即可,要是想自动执行,也可以用PL/pgSQL写个简单的脚本或者用动态SQL。
SQL Server
在SQL Server里,我们可以查询sys.columns系统视图来获取列信息:
SELECT 'SELECT ' + STRING_AGG(name, ', ') + ' FROM your_table;' FROM sys.columns WHERE object_id = OBJECT_ID('目标表名') AND name LIKE '%Points%';
如果你的SQL Server版本是2017之前的,STRING_AGG函数不支持,那就用STUFF结合FOR XML PATH的方式来拼接:
SELECT 'SELECT ' + STUFF(( SELECT ', ' + name FROM sys.columns WHERE object_id = OBJECT_ID('目标表名') AND name LIKE '%Points%' FOR XML PATH('') ), 1, 2, '') + ' FROM your_table;'
注意事项
- 记得把上面语句里的
你的数据库名、目标表名替换成你实际的数据库和表名称; - 如果你的表不在默认schema下(比如PostgreSQL的非public schema、SQL Server的自定义schema),要记得在条件里加上对应的schema筛选。
内容的提问来源于stack exchange,提问作者Tempuslight
相关产品推荐
相关产品推荐

