如何无需指定每列,对表中所有列执行LIKE模糊查询?
嘿,这个问题我太懂了——面对100列的表,手动写一堆OR条件简直是噩梦!下面给你几个不同数据库环境下的快捷方案,都是用动态SQL自动生成查询语句,不用手动列所有字段:
按数据库类型的解决方案
MySQL/MariaDB 版本
利用information_schema.COLUMNS系统表获取表的所有列名,自动拼接查询条件:
SET @search_term = '%QASHQAI%'; SET @table_name = 'vehicle'; -- 自动拼接所有列的LIKE条件 SELECT GROUP_CONCAT( COLUMN_NAME, ' LIKE ', QUOTE(@search_term) SEPARATOR ' OR ' ) INTO @where_clause FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() -- 当前数据库 AND TABLE_NAME = @table_name; -- 组装完整SQL并执行 SET @sql = CONCAT('SELECT * FROM ', @table_name, ' WHERE ', @where_clause); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
这个脚本会自动把vehicle表的所有列拼成col1 LIKE '%QASHQAI%' OR col2 LIKE '%QASHQAI%'...的格式,直接执行就能拿到所有匹配的记录。
SQL Server 版本
用sys.columns和STRING_AGG函数实现列名拼接:
DECLARE @searchTerm NVARCHAR(100) = '%QASHQAI%'; DECLARE @tableName NVARCHAR(100) = 'vehicle'; DECLARE @whereClause NVARCHAR(MAX); DECLARE @sql NVARCHAR(MAX); -- 拼接所有列的LIKE条件,处理列名特殊字符 SELECT @whereClause = STRING_AGG( QUOTENAME(COLUMN_NAME) + ' LIKE ' + QUOTENAME(@searchTerm, ''''), ' OR ' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = SCHEMA_NAME(); -- 当前 schema -- 执行动态SQL SET @sql = 'SELECT * FROM ' + QUOTENAME(@tableName) + ' WHERE ' + @whereClause; EXEC sp_executesql @sql;
PostgreSQL 版本
用string_agg和DO块执行动态逻辑:
DO $$ DECLARE search_term TEXT := '%QASHQAI%'; table_name TEXT := 'vehicle'; where_clause TEXT; sql TEXT; BEGIN -- 拼接列条件,自动处理标识符和字符串转义 SELECT string_agg( quote_ident(column_name) || ' LIKE ' || quote_literal(search_term), ' OR ' ) INTO where_clause FROM information_schema.columns WHERE table_name = table_name AND table_schema = current_schema(); -- 执行查询 sql := 'SELECT * FROM ' || quote_ident(table_name) || ' WHERE ' || where_clause; EXECUTE sql; END $$;
额外注意事项
- 性能优化:全列LIKE查询会扫描所有列和行,数据量大时速度会很慢。如果经常需要这类搜索,建议考虑给文本列加全文索引,或者用专门的搜索工具(比如Elasticsearch)。
- 过滤无用列:如果表中有数字、日期等非文本列,LIKE查询没意义,可以在查询
information_schema时加过滤条件,比如AND DATA_TYPE IN ('varchar', 'text', 'char')。 - 安全问题:动态SQL要注意防注入,上面的例子都用了数据库自带的转义函数(
QUOTE/QUOTENAME/quote_literal),不要直接拼接用户输入的内容。
内容的提问来源于stack exchange,提问作者hellomate




