当前位置: 代码迷 >> Sql Server >> 这个模糊查询的语句如何写呢
  详细解决方案

这个模糊查询的语句如何写呢

热度:97   发布时间:2016-04-27 10:49:21.0
这个模糊查询的语句怎么写呢?
数据库中的数据
UserId Prods
1 a,b,c,d
2 a,c,d,f
3 d,f

用户1选择的产品:a,b,c,d
用户2选择的产品:a,c,d,f
用户3选择的产品:d,f


当我查询条件是:产品选择为 a,c时可以吧用户 为1,2的查出来
当我查询条件是:产品选择为d 时可以把用户1,2,3 查询出来

也就是只要有多于一个产品能匹配上就可以查询出来, 相当于模糊查询。 
这个查询应该怎么写呢?

------解决方案--------------------
LIKE模糊查询用法

-- SQL模糊查询,使用like比较字,加上SQL里的通配符,请参考以下:
-- 1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
-- 2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
-- 3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
-- 4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
-- 5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
-- 6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
-- 7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

-- =======================================================================================================

--查询包含%并且以A-Z结尾的数据
SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '%\%%[A-Z]' escape '\'

--查询以%结尾的数据
SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '%\%%' escape '\'

--查询包含50'的数据
SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '%50''%'

--查询包含'的数据
SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '%''%'

--查询包含有下划线的colValue

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '%\_%' ESCAPE '\'

--查询包含有破折号的colValue
--LIKE '%-%--%'中的第一个破折号实际退出字符,紧接后面的%是常量字符数据值;
--第二个破折号是退出字符;
--第三个破折号是常量字符数据值。

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '%-%--%' ESCAPE '-'

--查询开头不是a-z,以e结尾的数据
SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '[a-z]e'

--查询以tes开头,不以t-e结尾的数据
SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE 'tes[^t-e]%'

--查询第二个字母是A的colValue

SELECT TOP 10 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '_A%'

--查询第三个字符为A,且长度为20个字符的colValue

SELECT TOP 10 * FROM dbo.TableName WITH(NOLOCK)
WHERE colName LIKE '__ayboy - Naked Sins'

------解决方案--------------------
SQL code
/*标题:分解字符串并查询相关数据作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-03-18地点:广东深圳说明:通过使用函数等方法分解字符串查询相关数据。问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。例如 @str = '1,2,3',查询下表得到记录1,4,5,6ID TypeID1  1,2,3,4,5,6,7,8,9,10,11,122  2,3 3  3,7,8,9 4  2,6 5  4,56  6,7 */-----------------------------create table tb (ID int , TypeID varchar(30)) insert into tb values(1 , '1,2,3,4,5,6,7,8,9,10,11,12') insert into tb values(2 , '2,3') insert into tb values(3 , '3,7,8,9') insert into tb values(4 , '2,6') insert into tb values(5 , '4,5')insert into tb values(6 , '6,7')go-------------------------------如果仅仅是一个,[email protected] = '1'.declare @str as varchar(30)set @str = '1'select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%'/*ID          TypeID                         ----------- ------------------------------ 1           1,2,3,4,5,6,7,8,9,10,11,12(所影响的行数为 1 行)*/-------------------------------如果包含两个,[email protected] = '1,2'.declare @str as varchar(30)set @str = '1,2'select * from tb where charindex(',' + left(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 or   charindex(',' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0select * from tb where ',' + typeid + ',' like '%,' + left(@str , charindex(',' , @str) - 1) + ',%' or   ',' + typeid + ',' like '%,' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',%'/*ID          TypeID                         ----------- ------------------------------ 1           1,2,3,4,5,6,7,8,9,10,11,122           2,34           2,6(所影响的行数为 3 行)*/---------------------------------------------如果包含三个或四个,用PARSENAME函数来处理.declare @str as varchar(30)set @str = '1,2,3,4'select * from tb where   charindex(',' + parsename(replace(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 or  charindex(',' + parsename(replace(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 or  charindex(',' + parsename(replace(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 or  charindex(',' + parsename(replace(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0 select * from tb where   ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 4) + ',%' or  ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 3) + ',%' or  ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 2) + ',%' or  ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 1) + ',%'/*ID          TypeID                         ----------- ------------------------------ 1           1,2,3,4,5,6,7,8,9,10,11,122           2,33           3,7,8,94           2,65           4,5(所影响的行数为 5 行)*/-----------------------------------------如果超过四个,则只能使用函数或动态SQL来分解并查询数据。/*名称:fn_split函数.功能:实现字符串分隔功能的函数*/create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))returns @temp table (a varchar(200))as begin  declare @i int  set @inputstr = rtrim(ltrim(@inputstr))  set @i = charindex(@seprator , @inputstr)  while @i >= 1  begin    insert @temp values(left(@inputstr , @i - 1))    set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)    set @i = charindex(@seprator , @inputstr)  end  if @inputstr <> '\'  insert @temp values(@inputstr)  return endgo--调用declare @str as varchar(30)set @str = '1,2,3,4,5'select distinct m.* from tb m,(select * from dbo.fn_split(@str,',')) nwhere charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0drop table tbdrop function dbo.fn_split /*ID          TypeID                         ----------- ------------------------------ 1           1,2,3,4,5,6,7,8,9,10,11,122           2,33           3,7,8,94           2,65           4,5(所影响的行数为 5 行)*/--------------------------------------------使用动态SQL的语句。declare @str varchar(200)declare @sql as varchar(1000)set @str = '1,2,3,4,5'set @sql = 'select ''' + replace(@str , ',' , ''' as id union all select ''')set @sql = @sql + ''''set @sql = 'select distinct a.* from tb a , (' + @sql + ') b where charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 'exec (@sql)/*ID          TypeID                         ----------- ------------------------------ 1           1,2,3,4,5,6,7,8,9,10,11,122           2,33           3,7,8,94           2,65           4,5(所影响的行数为 5 行)*/
  相关解决方案