我有一张表:CarRule
有下面这些列和数据
ID    Keywords
1     时速50%、 不到100%
2     违反禁令标志
3     违反规定停放、拒绝立即驶离、妨碍其他车辆我要查询这个CarRule表,根据关键字获取ID
例如:机动车行驶超过规定时速50%以上不到100%的  就能获取到  ID=1
      机动车违反禁令标志的                     就能获取到  ID=2
      违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的         
就能获取到  ID=3这个查询我怎么写。

解决方案 »

  1.   

    select id from carrule
    where keyworks=...如果...非精确,则需要对...截取特征字符串,也就无须sql了
      

  2.   

    select id from carrule where keyworks like '%不到100[%]%'
    select id from carrule where keyworks like '%违反禁令标志%'
    select id from carrule where keyworks like '%违反规定停放%' or keyworks like '%临时停车且驾驶人不在现场%' or keyworks like '%驾驶人虽在现场拒绝立即驶离%'  or keyworks like '%妨碍其他车辆、行人通行%'
      

  3.   

    你这是怎么拆词的,不是我说的这个,我的需求: 
    违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的
    通过上面这句话 获取carrule 表相应的id
      

  4.   

    你这是怎么拆词的,不是我说的这个,我的需求: 
    违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的
    通过上面这句话 获取carrule 表相应的id
    这个有难度,不会等待高手啊!
      

  5.   

    用t-sql  写这个,就是一个错误。在后台处理啊
      

  6.   

    1)建议CarRule表改为
    1     时速50%
    1     不到100%
    2     违反禁令标志
    3     违反规定停放
    3     拒绝立即驶离
    3     妨碍其他车辆
    2)游标CarRule
    如果字段在你要查询的句子里面(charindex函数) 就intset到#t里面
    3)select distinct id from #t
      

  7.   


    --1.先建立一个函数,通过分隔符来拆分keywords成多个关键字
    create function dbo.fn_splitSTR
    (
    @s varchar(8000),     --要分拆的字符串
    @split varchar(10)    --分隔字符

    returns @re table(                      --要返回的临时表
                         col varchar(1000)  --临时表中的列 
                     )
    as
    begin   
      declare @len int
      
      set @len = LEN(@split)      --分隔符不一定就是一个字符,可能是2个字符
      
      while CHARINDEX(@split,@s) >0
      begin
    insert into @re 
    values(left(@s,charindex(@split,@s) - 1))

    set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'')    --覆盖:字符串以及分隔符
      end
      
      insert into @re values(@s)
      
      return   --返回临时表
    end
    go  --2.建表
    DECLARE @CarRule TABLE(id INT,Keywords VARCHAR(100))
    INSERT INTO @carrule
    VALUES(1,'时速50%、不到100%'),
          (2,'违反禁令标志'),
          (3,'违反规定停放、拒绝立即驶离、妨碍其他车辆')
    ;WITH split  --拆分关键字
    as
    (
    SELECT  c.id,
            c.keywords,
            f.col  
    FROM @carrule c
    CROSS apply dbo.fn_splitSTR(c.keywords,'、') f
    )
    --3.
    SELECT s.id,
           s.keywordsFROM split s
    INNER JOIN 
    (
    SELECT s.id,
           s.keywords,
           count(col) AS split_str_count   --拆分成了几个关键字
    FROM split s
    GROUP BY s.id,
             s.keywords

    ) ss
            ON s.id = ss.idWHERE charindex(s.col,'机动车行驶超过规定时速50%以上不到100%的') > 0GROUP BY s.id,
             s.keywords
    HAVING count(*) = max(ss.split_str_count)  --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
      

  8.   

    第二个DECLARE @CarRule TABLE(id INT,Keywords VARCHAR(100))
    INSERT INTO @carrule
    VALUES(1,'时速50%、不到100%'),
          (2,'违反禁令标志'),
          (3,'违反规定停放、拒绝立即驶离、妨碍其他车辆')
    ;WITH split  --拆分关键字
    as
    (
    SELECT  c.id,
            c.keywords,
            f.col  
    FROM @carrule c
    CROSS apply dbo.fn_splitSTR(c.keywords,'、') f
    )
    --3.
    SELECT s.id,
           s.keywordsFROM split s
    INNER JOIN 
    (
    SELECT s.id,
           s.keywords,
           count(col) AS split_str_count   --拆分成了几个关键字
    FROM split s
    GROUP BY s.id,
             s.keywords

    ) ss
            ON s.id = ss.idWHERE charindex(s.col,'机动车违反禁令标志的') > 0GROUP BY s.id,
             s.keywords
    HAVING count(*) = max(ss.split_str_count)  --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
      

  9.   

    DECLARE @CarRule TABLE(id INT,Keywords VARCHAR(100))
    INSERT INTO @carrule
    VALUES(1,'时速50%、不到100%'),
          (2,'违反禁令标志'),
          (3,'违反规定停放、拒绝立即驶离、妨碍其他车辆')
    ;WITH split  --拆分关键字
    as
    (
    SELECT  c.id,
            c.keywords,
            f.col  
    FROM @carrule c
    CROSS apply dbo.fn_splitSTR(c.keywords,'、') f
    )
    --3.
    SELECT s.id,
           s.keywordsFROM split s
    INNER JOIN 
    (
    SELECT s.id,
           s.keywords,
           count(col) AS split_str_count   --拆分成了几个关键字
    FROM split s
    GROUP BY s.id,
             s.keywords

    ) ss
            ON s.id = ss.idWHERE charindex(s.col,'违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的就能获取到') > 0GROUP BY s.id,
             s.keywords
    HAVING count(*) = max(ss.split_str_count)  --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
      

  10.   

    你这是怎么拆词的,不是我说的这个,我的需求: 
    违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的
    通过上面这句话 获取carrule 表相应的idCarRule表建立得不合理了,建立增加一个类别来作区分
      

  11.   

    可能我的描述没有说清楚,
    例如:3,'违反规定停放、拒绝立即驶离、妨碍其他车辆'  需要“违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的就能获取到” 对这个分词都必须存在才可以。
    select id from carrule where keyworks like '%违反规定停放%' and keyworks like '%临时停车且驾驶人不在现场%' and keyworks like '%驾驶人虽在现场拒绝立即驶离%'  and  keyworks like '%妨碍其他车辆、行人通行%'
      

  12.   

    例如:3,'违反规定停放、拒绝立即驶离、妨碍其他车辆'  需要“违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的就能获取到” 对这个分词都必须存在才可以。
     select id from carrule where keyworks like '%违反规定停放%' and (keyworks like '%临时停车且驾驶人不在现场%' or keyworks like '%驾驶人虽在现场拒绝立即驶离%')  and  keyworks like '%妨碍其他车辆、行人通行%'
      

  13.   

    阳泉酒家小当家  SQL  功力深厚 学习中  向你看齐
      

  14.   


    奇怪的是由ID找关键字,但问题是用关键字找ID,不现实。
      

  15.   


    奇怪的是由ID找关键字,但问题是用关键字找ID,不现实。上面的代码其实就是,通过charindex函数,来通过关键字过滤,由相应的关键字再来找到相应的id的。