数据库中的数据
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 查询出来也就是只要有多于一个产品能匹配上就可以查询出来, 相当于模糊查询。 
这个查询应该怎么写呢?

解决方案 »

  1.   

       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 '%''%'--查询包含有下划线的colValueSELECT 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的colValueSELECT TOP 10 * FROM dbo.TableName  WITH(NOLOCK)
    WHERE colName LIKE '_A%'--查询第三个字符为A,且长度为20个字符的colValueSELECT TOP 10 * FROM dbo.TableName  WITH(NOLOCK)
    WHERE colName LIKE '__ayboy - Naked Sins'
      

  2.   


    /*
    标题:分解字符串并查询相关数据
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2008-03-18
    地点:广东深圳
    说明:通过使用函数等方法分解字符串查询相关数据。问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
    例如 @str = '1,2,3',查询下表得到记录1,4,5,6
    ID TypeID
    1  1,2,3,4,5,6,7,8,9,10,11,12
    2  2,3 
    3  3,7,8,9 
    4  2,6 
    5  4,5
    6  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
    -----------------------------
    --如果仅仅是一个,如@str = '1'.
    declare @str as varchar(30)
    set @str = '1'
    select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0
    select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%'
    /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    (所影响的行数为 1 行)
    */-----------------------------
    --如果包含两个,如@str = '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 + ',') > 0
    select * 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,12
    2           2,3
    4           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,12
    2           2,3
    3           3,7,8,9
    4           2,6
    5           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 
    end
    go--调用
    declare @str as varchar(30)
    set @str = '1,2,3,4,5'select distinct m.* from tb m,
    (select * from dbo.fn_split(@str,',')) n
    where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0drop table tb
    drop function dbo.fn_split /*
    ID          TypeID                         
    ----------- ------------------------------ 
    1           1,2,3,4,5,6,7,8,9,10,11,12
    2           2,3
    3           3,7,8,9
    4           2,6
    5           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,12
    2           2,3
    3           3,7,8,9
    4           2,6
    5           4,5
    (所影响的行数为 5 行)
    */
      

  3.   

    like '%a%' and like '%c%'
      

  4.   

    --1,产品选择为 a,c时可以吧用户 为1,2的查出来select * from tableName where prods like'%a%' and 
    prods like'%c%'--2、产品选择为d 时可以把用户1,2,3 查询出来select * from tableName where prods like'%a%' and 
    prods like'%d%'
      

  5.   

    --2、产品选择为d 时可以把用户1,2,3 查询出来select * from tableName where  prods like'%d%'
      

  6.   


    declare @t table(uid int,prods varchar(10))
    insert into @t select 1,'a,b,c,d'
    union all select 2,'a,c,d,f'
    union all select 3,'d,f'
    declare @case varchar(20)
    set @case='a,c'
    select * from @t where prods like '%'+REPLACE(@case,',','%')+'%'
    /*
    uid prods
    1 a,b,c,d
    2 a,c,d,f
    */
      

  7.   

    create table tb (ID int , prods 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
    -------------------------------
    declare @sql nvarchar(max)
    declare @proName nvarchar (20)
    declare @sigproName nvarchar (20)
    declare @sigproName1 nvarchar (20)
    set @proName='5'
    if (charindex(',',@proName)>0)
     begin
            
            set @sigproName1=substring(@proName,0,charindex(',',@proName))
            set @sql='select * from tb where prods like''%'+@sigproName1+'%'''
     while (charindex(',',@proName)>0)
     begin
     select @proName=substring(@proName,charindex(',',@proName)+1,(len(@proName)-charindex(',',@proName)))
     if (charindex(',',@proName)>0)
     begin
    select @sigproName=substring(@proName,charindex(',',@proName)+1,(len(@proName)-charindex(',',@proName)))
     end
     else
    begin
    set @sigproName=@proName
    end
                      
                      set @sql= @sql+'union select * from tb where prods like''%'+@sigproName+'%'''
     end
         end
     else
    begin
    set @sigproName=@proName
             set @sql='select * from tb where prods like''%'+@sigproName+'%'''
    end
    exec sp_executeSql @sql
      

  8.   

    create table tb (ID int , prods 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
    -------------------------------
    declare @sql nvarchar(max)
    declare @proName nvarchar (20)
    declare @sigproName nvarchar (20)
    declare @sigproName1 nvarchar (20)
    set @proName='5'
    if (charindex(',',@proName)>0)
     begin
            
            set @sigproName1=substring(@proName,0,charindex(',',@proName))
            set @sql='select * from tb where prods like''%'+@sigproName1+'%'''
     while (charindex(',',@proName)>0)
     begin
     select @proName=substring(@proName,charindex(',',@proName)+1,(len(@proName)-charindex(',',@proName)))
     if (charindex(',',@proName)>0)
     begin
    select @sigproName=substring(@proName,charindex(',',@proName)+1,(len(@proName)-charindex(',',@proName)))
     end
     else
    begin
    set @sigproName=@proName
    end
                      
                      set @sql= @sql+'union select * from tb where prods like''%'+@sigproName+'%'''
     end
         end
     else
    begin
    set @sigproName=@proName
             set @sql='select * from tb where prods like''%'+@sigproName+'%'''
    end
    exec sp_executeSql @sql
      

  9.   

    9楼正解。传进来的a,c中间的符号肯定是固定的。只要将这些固定的符号替换成%就OK了
      

  10.   


    这个方法很好,不过@case='c,a' 就查不出来,借你的方法写一个:if object_id('t','u') is not null drop table t
    go
    create table t(uid int,prods varchar(10))
    insert into t select 1,'a,b,c,d'
    union all select 2,'a,c,d,f'
    union all select 3,'d,f'
    go
    --你的方法
    declare @case varchar(20)
    set @case='c,a'
    select * from t where prods like '%'+REPLACE(@case,',','%')+'%'
    --我改后
    declare @sql varchar(100)
    set @sql='''%'+REPLACE(@case,',','%'' and prods like ''%')+'%''';
    exec('select * from t where prods like '+@sql);
    drop table t/*
    (3 行受影响)
    uid         prods
    ----------- ----------(0 行受影响)uid         prods
    ----------- ----------
    1           a,b,c,d
    2           a,c,d,f(2 行受影响)
    */
      

  11.   

    还有一种方法:CHARINDEX()方法if object_id('t','u') is not null drop table t
    go
    create table t(uid int,prods varchar(10))
    insert into t select 1,'a,b,c,d'
    union all select 2,'a,c,d,f'
    union all select 3,'d,f'
    godeclare @case varchar(20)
    set @case='c,a'--你的方法
    select * from t where prods like '%'+REPLACE(@case,',','%')+'%'--下面是改后的
    declare @sql varchar(100)
    set @sql='''%'+REPLACE(@case,',','%'' and prods like ''%')+'%''';
    exec('select * from t where prods like '+@sql);set @sql=REPLACE(@case,',',''',prods)>0 and charindex(''');
    exec('select * from t where charindex('''+@sql+''',prods)>0');
    /*
    (3 行受影响)
    uid         prods
    ----------- ----------(0 行受影响)uid         prods
    ----------- ----------
    1           a,b,c,d
    2           a,c,d,f(2 行受影响)uid         prods
    ----------- ----------
    1           a,b,c,d
    2           a,c,d,f
    */