如何在MSSQL中查询任意列包含指定字符串的行?
MSSQL 多字符串列任意匹配查询实现方案
方案1:常规条件匹配(适合列数固定、不需要动态扩展的场景)
无需复杂逻辑,直接拼接列的匹配条件即可,可读性高、执行逻辑稳定:
- 单个字符串精确匹配
假设表名为your_table,10个字符串列名为col1到col10,查询任意列等于目标字符串的行,写法如下:SELECT * FROM your_table WHERE '目标字符串' IN (col1,col2,col3,col4,col5,col6,col7,col8,col9,col10); - 多个字符串精确匹配
如果要同时匹配多个关键词,直接加OR条件即可:SELECT * FROM your_table WHERE '关键词1' IN (col1,col2,col3,col4,col5,col6,col7,col8,col9,col10) OR '关键词2' IN (col1,col2,col3,col4,col5,col6,col7,col8,col9,col10) OR '关键词3' IN (col1,col2,col3,col4,col5,col6,col7,col8,col9,col10); - 模糊匹配
如果需要匹配包含目标字符串的行,改用LIKE语法:SELECT * FROM your_table WHERE col1 LIKE '%目标字符串%' OR col2 LIKE '%目标字符串%' OR col3 LIKE '%目标字符串%' -- 依次补全剩余7个列的匹配规则 OR col10 LIKE '%目标字符串%';
方案2:动态SQL实现(适合列数多、匹配关键词不固定的场景)
不需要手动罗列所有列名,自动读取表的字符串类型列拼接查询逻辑,适合列数较多、后续可能新增列的场景:
-- 定义存储要匹配关键词的临时表 DECLARE @searchStrings TABLE (val NVARCHAR(1000)); INSERT INTO @searchStrings(val) VALUES ('关键词1'),('关键词2'),('关键词3'); -- 此处插入所有要匹配的字符串 DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX); -- 自动读取表中所有字符串类型的列名 SELECT @cols = STRING_AGG(QUOTENAME(name), ',') FROM sys.columns WHERE object_id = OBJECT_ID('your_table') -- 替换为实际表名 AND system_type_id IN (167,175,231,239); -- 筛选varchar/char/nvarchar/nchar类型的列 -- 拼接查询SQL SET @sql = N' SELECT * FROM your_table WHERE EXISTS ( SELECT 1 FROM @searchStrings s WHERE s.val IN (' + @cols + N') )'; -- 执行查询 EXEC sp_executesql @sql, N'@searchStrings TABLE(val NVARCHAR(1000))', @searchStrings;
注意事项
- 动态SQL通过
sp_executesql传参可避免SQL注入风险,不要直接拼接用户输入的关键词 - 数据量较大时建议给常用查询列增加索引,否则全表扫描性能较差
内容的提问来源于stack exchange,提问作者user1640555533423
相关产品推荐
相关产品推荐

