修改一下存储的方式:
甲.F="1,2,3,5,6"
乙.F="2,3,4,5,7,8"
丙.F="2,3,5,6,7"-------------------------------------------------------------
declare @t table(id int,code varchar(4),func varchar(20))
insert into @t select 1,'甲','1,2,3,5,6'
insert into @t select 1,'乙','2,3,4,5,7,8'
insert into @t select 1,'丙','2,3,5,6,7'select
    distinct a.*
from
    @t a,
    (select '3' as func union select '7') b
where
    charindex(','+b.func+',' , ','+a.func+',')>0/*
id          code func                 
----------- ---- -------------------- 
1           丙    2,3,5,6,7
1           甲    1,2,3,5,6
1           乙    2,3,4,5,7,8
*/

解决方案 »

  1.   

    select * from table where F like '%3%' or F like '%7%'有多少个写多少个.
      

  2.   

    dawugui(潇洒老乌龟) ( ) 信誉:100    Blog  2007-03-12 10:14:19  得分: 0  
     
     
       select * from table where F like '%3%' or F like '%7%'有多少个写多少个.  
     
    这位仁兄,如果LZ的字段有100个,莫非要用100 OR?关注!!!!
      

  3.   

    2楼的我看下先,
    3楼的,or  like用太多了会不会慢啊~?? 不过我也没实验过
      

  4.   

    用一块表专门做交叉使用:
    A表存手机
    B表存功能
    C表存交叉信息(ID:关键字,MobileID:手机ID,FuncID:功能ID),每条记录只记录一个手机的一项功能。
    然后用
    select * from A where MobileID in (select MobileID in C where FuncID in (3 ,7, …))
      

  5.   

    yf110() 此人说的非常好,用表关联,可能是效率最高也是最省事的。。
    扩展的话也最省事A表存手机
    B表存功能
    C表存功能信息TA:MID
    TB:FUNID
    C:MID,FUNIDSQL:select * from A where MID in (select MID in C where FuncID in (3 ,7, …))在多or也不怕。。
      

  6.   

    我的建议是:1、调整数据的存储方式,将手机所支持的功能编号用逗号分隔,顺序或无序存放在一个字段中2、借助charindex()函数以及逗号分隔符检索 1 所描述的字段3、不使用多个 or 的连接,而使用 select 功能号 from 功能表 where 功能号 in(...) 的方式
    以下是实现的示例:create table func(id int,[desc] varchar(40))
    insert into func values(1,'触摸屏  ')
    insert into func values(2,'FM收音  ')
    insert into func values(3,'MP3播放 ') 
    insert into func values(4,'视频播放')  
    insert into func values(5,'视频拍摄')  
    insert into func values(6,'GPS功能 ')  
    insert into func values(7,'A2DP蓝牙立体声')  
    insert into func values(8,'电子词典')create table mobile(id int,code varchar(4),func varchar(20))
    insert into mobile values(1,'甲','1,2,3,5,6'  )
    insert into mobile values(2,'乙','2,3,4,5,7,8')
    insert into mobile values(3,'丙','2,3,5,6,7'  )
    goselect
        distinct a.*
    from
        mobile a,(select id from func where id in(3,7)) b
    where
        charindex(','+rtrim(b.id)+',' , ','+a.func+',')>0
    go/*
    id          code func                 
    ----------- ---- -------------------- 
    1           甲    1,2,3,5,6
    2           乙    2,3,4,5,7,8
    3           丙    2,3,5,6,7
    */drop table func,mobile
    go
      

  7.   

    汗~~  sorry  是邹建大哥    普通话不标准惹的祸
      

  8.   

    我觉得还是用“&” 和 “ |” 位运算比较省事高效 虽然不直观
    但是给用户删除添加项目相当方便
      

  9.   

    当然字段类型 要int或者 bigint类型比较好
      

  10.   

    将手机具有的功能单独放到一个表中,手机本身是另外一个表,这个手机表里有一个字段用来记录这个手机所具有的功能,存储的内容就是手机功能表里的功能的编号的集合,比如某个手机具有2,FM收音  4,视频播放  就记录为:2,4    当搜索的时候,只需要判断这个字段的内容是否含有用户要搜索的功能的ID编号.
      

  11.   

    修改一下存储方式: 以二进制存储
    甲.F="11101100"
    乙.F="01111011"
    丙.F="01101110"
    sql: select * from table 
         where F&32>0 or F&3>0
        
      

  12.   

    采取分表方式,无论从那个角度来说都应该这样做。功能项如果是固定的,少的则为一个字典表
    如果是经常变化的,大的则为一个关联的单表。
    采用一个字段存储的方式如果数据量达到百万级的,采用like及截取字段某段内容,效率上会有问题;另外操作上会有问题,就如你所提的。
      

  13.   

    to : JINGZHONGHUA521(期望) 
    就是这意思假如要添加某一些属性 只要修改 甲.f=甲.f | &HF0
    其中&HF0 转化二进制就是 "11110000" 就是第五 至 第八个 属性同时赋值
      

  14.   

    JINGZHONGHUA521(期望) 的方法很好啊。
    学习中。甲.F="11101100"
    乙.F="01111011"
    丙.F="01101110"sql: select * from table 
         where F&32>0 or F&3>0是不是可以个改成
         select * from table 
         where F&35>0?
      

  15.   

    用select * from table 
         where F&32>0 or F&3>0
    这个去取结果的话,是不是会太慢呀,效率和 in(3,7,.....)比不知道哪个更高,请研究过的朋友说一下。个人觉得分三个表科学又直观,代码也简单,应用也方便,扩展也容易
      

  16.   

    select * from table 
         where F&32>0 or F&3>0应该是      where F&32>0 or F&2>0 或者 where F&34>0 吧效率和 in(3,7,.....)比不知道哪个更高,请研究过的朋友说一下。
      

  17.   

    to shubo2000(阿波罗)  位运算 当然要比 in(3,7,...) 效率快很多~
    而且 赋值 或者 做判断 都只要与1个int类型的值  做位运算就出结果了
      

  18.   

    可以考虑微软注册表的方法手机表有个字段F表示可能拥有的高级功能:1,触摸屏
    3,FM收音
    5,MP3播放
    7,视频播放1+3 = 4 (4就表示有 1和3的功能)
    3+7+1 = 11 (就表示  1和3和7的功能)保存的时候就是一个数,只需要写一个程序转换成这个数就可以了。
      

  19.   

    给你个思路:数据库可以这样建
    先定义一些常量:
    0,没有功能=0
    1,触摸屏  =1
    2,FM收音  =2
    3,MP3播放  =4
    4,视频播放 =8 
    5,视频拍摄  =16
    6,GPS功能   =32
    7,A2DP蓝牙立体声  =64
    8,电子词典     =128
    n,…………   =2^N数据库表就定义2个字段就可以了。手机型号:
    功能:存各功能的和(无论怎么组合值都是唯一的)这也是很多场合用户和权限的对应关系的实现方法。
    你的要求和这个类似。
      

  20.   

    实现方法:先定义一些常量:
    0,没有功能=0
    1,触摸屏  =1
    2,FM收音  =2
    3,MP3播放  =4
    4,视频播放 =8 
    5,视频拍摄  =16
    6,GPS功能   =32
    7,A2DP蓝牙立体声  =64
    8,电子词典     =128
    n,…………   =2^(N-1)根据以上定义的求各手机的功能和
    手机甲有功能1,2,3,5,6,=55
    手机乙有功能2,3,4,5,7,8=222
    手机丙有功能2,3,5,6,7=118下面是伪代码
    creat table 手机(型号 nvarchar(10),功能 int)
    inset into 手机 values(甲,55)
    inset into 手机 values(乙,222)
    ……………………………………
    搜索条件:
    select * from 手机 where 功能 & 功能3(对应的常量为4) or 功能 & 功能7 (对应的常量为64)
      

  21.   

    再补充以下。最后一行写错了。
    应该是
    搜索条件:
    select * from 手机 where 功能 & (功能3+功能7+……)〉0
      

  22.   

    数据库可以这样建
    先定义一些常量:
    0,没有功能=0
    1,触摸屏  =1
    2,FM收音  =2
    3,MP3播放  =4
    4,视频播放 =8 
    5,视频拍摄  =16
    6,GPS功能   =32
    7,A2DP蓝牙立体声  =64
    8,电子词典     =128
    n,…………   =2^N正解。
    用位运算即可,效率很高,存储所用的空间也小。
      

  23.   

    我想如果你能遵守关系数据库设计“第一范式”你的问题就很好解决了。
    第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
      

  24.   

    to shubo2000(阿波罗) 
    老兄说的很对
      

  25.   

    建议调整表设计, 而不是在查询上做文章, 否则数据量一大, 你的服务器就撑不了功能表(功能id, 功能名称)
    产品表(产品id, 产品名称)
    产品功能表(功能id, 产品id)查询的时候, 只需要用类似这样的查询:
    select * from 产品表 a
    where exists(
        select * from 产品功能表 
        where 功能id in(3, 7)
            and 产品id = a.产品id)
    如果要根据功能名称来查, 只需要再关联功能表即可
      

  26.   

    可以这样试一下:
    select * from table where substring(f,3,1)=1 or substring(f,7,1)=1
      

  27.   

    zjcxc(邹建) ( ) 信誉:673    Blog  2007-03-14 12:28:30  得分: 0  
     
     
       建议调整表设计, 而不是在查询上做文章, 否则数据量一大, 你的服务器就撑不了功能表(功能id, 功能名称)
    产品表(产品id, 产品名称)
    产品功能表(功能id, 产品id)查询的时候, 只需要用类似这样的查询:
    select * from 产品表 a
    where exists(
        select * from 产品功能表 
        where 功能id in(3, 7)
            and 产品id = a.产品id)
    如果要根据功能名称来查, 只需要再关联功能表即可
      
     
    ===============================zjcxc(邹建) 
    这个是比较灵活
    但是我有一个疑问,
    如果有10万件产品,每件产品都有10个功能
    那么中间的 产品功能表 就是 100万条记录
    如果产品增加到100万条呢
    那中间的就是1000万条记录了
    这样中间那个 产品功能表 是不是太大了,SELECT 起来会不会有点因为自己也需要设计类似的产品数据库,所以望回复,