一个表中 在所有列进行模糊查询 的SQL语句是什么?

时间:2022-03-19 21:52:02
一个表中 在所有列进行模糊查询,
我之前用的是这个,%s是变量的值,这个语句可以使用,就是太长了。

select * from Project where PId like '%%%s%%' or PName   like '%%%s%%'or PManager  like '%%%s%%' or PEngineer like '%%%s%%'


现在我这个表有二十多列,总不能也这么写吧,请问有更简单的方法吗,或者更简便的SQL语句吗

10 个解决方案

#1


可以用动态拼接sql语句的方式实现

#2


引用 楼主 baidu_39486224 的回复:
一个表中 在所有列进行模糊查询,
我之前用的是这个,%s是变量的值,这个语句可以使用,就是太长了。

select * from Project where PId like '%%%s%%' or PName   like '%%%s%%'or PManager  like '%%%s%%' or PEngineer like '%%%s%%'


现在我这个表有二十多列,总不能也这么写吧,请问有更简单的方法吗,或者更简便的SQL语句吗

你有必要一次多所有列模糊查询吗?

#3


20多列时可用动态

--调用SYSCOLUMNS生成

#4


本帖最后由 roy_88 于 2017-08-04 16:34:42 编辑
e.g.
DECLARE @sql NVARCHAR(max)=''
SELECT @sql=@sql+' OR '+name ' LIKE ''%%%s%%''' FROM sys.columns WHERE object_id=OBJECT_ID('Project')--这里可以过滤掉列名name not in 
SET @sql=STUFF(@sql,1,3,'')
PRINT @sql

EXEC('SELECT * FROM Project WHERE '+@sql);

#5


USE tempdb
GO
--模拟你的表结构与数据
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(
id INT PRIMARY KEY IDENTITY(1,1)
,c1 NVARCHAR(100)
,c2  NVARCHAR(100)
,c3  NVARCHAR(100)
,c4  NVARCHAR(100)
,c5  NVARCHAR(100)
)
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('ab43234','14qg','23fg','32a2','554aw')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('cde','a','3','bbb','ccc')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('c2e','a2a','3','b3b','cdc')

--类似下面处理就好了
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'

EXEC sp_executesql @sql,N'@str nvarchar(50)',@str

一个表中 在所有列进行模糊查询 的SQL语句是什么?

#6


DECLARE @s NVARCHAR(100) = 'aaaa' --传入的搜索参数
DECLARE @sql NVARCHAR(MAX) = 'select * from Project where '
DECLARE @col NVARCHAR(MAX) = ''
SELECT  @col = @col +' or '+ name + ' like ''%' + @s + '% '''
FROM    SYSCOLUMNS
WHERE   id = OBJECT_ID('Project')
EXEC( @sql + STUFF(@col,1,3,''))






#7



---可以一次把所有的列都穿在一起然后再like
select * from Project where PId  + PName + PManager + PEngineer like '%%%s%%'

#8


楼主注意:
这种字符串值不能随便拼sql , 这样会带来 sql注入 的风险!!!
最好的方式还是 #5 那样参数化查询。

#9


首先谢谢各位大佬。周末玩了两天..
现在的问题是,我在MFC中做的查询,所以这个语句是在Execute(m_sqlCmd, &RecordsAffected, adCmdText);
中的m_sqlCmd的一个语句...用VC确实蛋疼,所以这个语句怎么弄?
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
这样怎么才能在MFC中用呢

#10


最后用的计算列谢啦

#1


可以用动态拼接sql语句的方式实现

#2


引用 楼主 baidu_39486224 的回复:
一个表中 在所有列进行模糊查询,
我之前用的是这个,%s是变量的值,这个语句可以使用,就是太长了。

select * from Project where PId like '%%%s%%' or PName   like '%%%s%%'or PManager  like '%%%s%%' or PEngineer like '%%%s%%'


现在我这个表有二十多列,总不能也这么写吧,请问有更简单的方法吗,或者更简便的SQL语句吗

你有必要一次多所有列模糊查询吗?

#3


20多列时可用动态

--调用SYSCOLUMNS生成

#4


本帖最后由 roy_88 于 2017-08-04 16:34:42 编辑
e.g.
DECLARE @sql NVARCHAR(max)=''
SELECT @sql=@sql+' OR '+name ' LIKE ''%%%s%%''' FROM sys.columns WHERE object_id=OBJECT_ID('Project')--这里可以过滤掉列名name not in 
SET @sql=STUFF(@sql,1,3,'')
PRINT @sql

EXEC('SELECT * FROM Project WHERE '+@sql);

#5


USE tempdb
GO
--模拟你的表结构与数据
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(
id INT PRIMARY KEY IDENTITY(1,1)
,c1 NVARCHAR(100)
,c2  NVARCHAR(100)
,c3  NVARCHAR(100)
,c4  NVARCHAR(100)
,c5  NVARCHAR(100)
)
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('ab43234','14qg','23fg','32a2','554aw')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('cde','a','3','bbb','ccc')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('c2e','a2a','3','b3b','cdc')

--类似下面处理就好了
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'

EXEC sp_executesql @sql,N'@str nvarchar(50)',@str

一个表中 在所有列进行模糊查询 的SQL语句是什么?

#6


DECLARE @s NVARCHAR(100) = 'aaaa' --传入的搜索参数
DECLARE @sql NVARCHAR(MAX) = 'select * from Project where '
DECLARE @col NVARCHAR(MAX) = ''
SELECT  @col = @col +' or '+ name + ' like ''%' + @s + '% '''
FROM    SYSCOLUMNS
WHERE   id = OBJECT_ID('Project')
EXEC( @sql + STUFF(@col,1,3,''))






#7



---可以一次把所有的列都穿在一起然后再like
select * from Project where PId  + PName + PManager + PEngineer like '%%%s%%'

#8


楼主注意:
这种字符串值不能随便拼sql , 这样会带来 sql注入 的风险!!!
最好的方式还是 #5 那样参数化查询。

#9


首先谢谢各位大佬。周末玩了两天..
现在的问题是,我在MFC中做的查询,所以这个语句是在Execute(m_sqlCmd, &RecordsAffected, adCmdText);
中的m_sqlCmd的一个语句...用VC确实蛋疼,所以这个语句怎么弄?
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
这样怎么才能在MFC中用呢

#10


最后用的计算列谢啦