原文:在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

这个语句怎么写?

http://bbs.csdn.net/topics/390490832?page=1

我有一张表:CarRule

有下面这些列和数据

ID    Keywords

1     时速50%、 不到100%

2     违反禁令标志

3     违反规定停放、拒绝立即驶离、妨碍其他车辆

我要查询这个CarRule表,根据关键字获取ID

例如:机动车行驶超过规定时速50%以上不到100%的  就能获取到  ID=1

      机动车违反禁令标志的                     就能获取到  ID=2

      违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的         

就能获取到  ID=3

这个查询我怎么写。

我的解法:


  1. --1.先建立一个函数,通过分隔符来拆分keywords成多个关键字
  2. create function dbo.fn_splitSTR
  3. (
  4. @s varchar(8000), --要分拆的字符串
  5. @split varchar(10) --分隔字符
  6. )
  7. returns @re table( --要返回的临时表
  8. col varchar(1000) --临时表中的列
  9. )
  10. as
  11. begin
  12. declare @len int
  13. set @len = LEN(@split) --分隔符不一定就是一个字符,可能是2个字符
  14. while CHARINDEX(@split,@s) >0
  15. begin
  16. insert into @re
  17. values(left(@s,charindex(@split,@s) - 1))
  18. set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'') --覆盖:字符串以及分隔符
  19. end
  20. insert into @re values(@s)
  21. return --返回临时表
  22. end
  23. go
  24. --2.建表
  25. DECLARE @CarRule TABLE(id INT,Keywords VARCHAR(100))
  26. INSERT INTO @carrule
  27. VALUES(1,'时速50%、不到100%'),
  28. (2,'违反禁令标志'),
  29. (3,'违反规定停放、拒绝立即驶离、妨碍其他车辆')
  30. ;WITH split --拆分关键字
  31. as
  32. (
  33. SELECT c.id,
  34. c.keywords,
  35. f.col
  36. FROM @carrule c
  37. CROSS apply dbo.fn_splitSTR(c.keywords,'、') f
  38. )
  39. --3.第1个查询
  40. SELECT s.id,
  41. s.keywords
  42. FROM split s
  43. INNER JOIN
  44. (
  45. SELECT s.id,
  46. s.keywords,
  47. count(col) AS split_str_count --拆分成了几个关键字
  48. FROM split s
  49. GROUP BY s.id,
  50. s.keywords
  51. ) ss
  52. ON s.id = ss.id
  53. WHERE charindex(s.col,'机动车行驶超过规定时速50%以上不到100%的') > 0
  54. GROUP BY s.id,
  55. s.keywords
  56. HAVING count(*) = max(ss.split_str_count) --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配

第2个查询:


  1. DECLARE @CarRule TABLE(id INT,Keywords VARCHAR(100))
  2. INSERT INTO @carrule
  3. VALUES(1,'时速50%、不到100%'),
  4. (2,'违反禁令标志'),
  5. (3,'违反规定停放、拒绝立即驶离、妨碍其他车辆')
  6. ;WITH split --拆分关键字
  7. as
  8. (
  9. SELECT c.id,
  10. c.keywords,
  11. f.col
  12. FROM @carrule c
  13. CROSS apply dbo.fn_splitSTR(c.keywords,'、') f
  14. )
  15. --3.
  16. SELECT s.id,
  17. s.keywords
  18. FROM split s
  19. INNER JOIN
  20. (
  21. SELECT s.id,
  22. s.keywords,
  23. count(col) AS split_str_count --拆分成了几个关键字
  24. FROM split s
  25. GROUP BY s.id,
  26. s.keywords
  27. ) ss
  28. ON s.id = ss.id
  29. WHERE charindex(s.col,'机动车违反禁令标志的') > 0
  30. GROUP BY s.id,
  31. s.keywords
  32. HAVING count(*) = max(ss.split_str_count) --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配

第3个查询:


  1. DECLARE @CarRule TABLE(id INT,Keywords VARCHAR(100))
  2. INSERT INTO @carrule
  3. VALUES(1,'时速50%、不到100%'),
  4. (2,'违反禁令标志'),
  5. (3,'违反规定停放、拒绝立即驶离、妨碍其他车辆')
  6. ;WITH split --拆分关键字
  7. as
  8. (
  9. SELECT c.id,
  10. c.keywords,
  11. f.col
  12. FROM @carrule c
  13. CROSS apply dbo.fn_splitSTR(c.keywords,'、') f
  14. )
  15. --3.
  16. SELECT s.id,
  17. s.keywords
  18. FROM split s
  19. INNER JOIN
  20. (
  21. SELECT s.id,
  22. s.keywords,
  23. count(col) AS split_str_count --拆分成了几个关键字
  24. FROM split s
  25. GROUP BY s.id,
  26. s.keywords
  27. ) ss
  28. ON s.id = ss.id
  29. WHERE charindex(s.col,'违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的就能获取到') > 0
  30. GROUP BY s.id,
  31. s.keywords
  32. HAVING count(*) = max(ss.split_str_count) --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. hue 登录访问不了HDFS webhdfs_url 调整

    Cannot access: /. Note: you are a Hue admin but not a HDFS superuser, "hdfs" or part of HD ...

  2. 【插件式框架探索系列】使用多UI线程提升性能

    了解WPF线程模型的都知道,UI线程负责呈现和管理UI,而UI元素(派生自 DispatcherObject)只能由创建该元素的线程来访问,这就导致了一些耗时的UI操作将影 响到整个应用程序性能,未响 ...

  3. ubuntu 防火墙打开关闭

    1.查看防火墙状态 sudo ufw status 2.打开防火墙 sudo ufw enable 3.关闭防火墙 sudo ufw disable

  4. Spring cloud微服务安全实战-5-3后端服务改造

    本节来实现一个登陆的效果. 需要一个登陆前的页面和登陆后的页面. 直接粘贴过来的代码 这是一个和后台的绑定 后台要有个autenticated的对象来实现绑定,ts内我们定义这个autenticate ...

  5. (?:pattern) 与 (?=pattern)的区别

    共同点 (?:pattern) 与 (?=pattern)都匹配pattern,但不会把pattern结果放到Matches的集合中. 区别 (?:pattern) 匹配得到的结果包含pattern. ...

  6. Spring MVC 验证表单

      在实际工作中,得到数据后的第一步就是检验数据的正确性,如果存在录入上的问题,一般会通过注解校验,发现错误后返回给用户,但是对于一些逻辑上的错误,比如购买金额=购买数量×单价,这样的规则就很难使用注 ...

  7. 【翻译】生成 Timestamps / Watermarks

    本文翻译自flink官网:https://ci.apache.org/projects/flink/flink-docs-release-1.7/dev/event_timestamps_waterm ...

  8. LeetCode_263. Ugly Number

    263. Ugly Number Easy Write a program to check whether a given number is an ugly number. Ugly number ...

  9. 【物联网】esp8266

    esp8266环境配置 https://www.jianshu.com/p/cb0274d612b5 https://www.cnblogs.com/zleiblogs/p/7126106.html ...

  10. ajaxSubmit 页面生成的html 中含有表单提交表单方式

    $("#form_title").ajaxSubmit({ //页面生成的html 中含有表单提交表单方式 dataType: "json", success ...