原文:在论坛中出现的比较难的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. 【maven】在pom.xml中引入对json-lib的依赖dependency

    <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</art ...

  2. Xcode: Xcode中Command Line Tools的安装方法

    1. 打开终端: 2. 输入命令: xcode-select --install ,如果出现下图,说明你已经安装过了,下边内容也不用看了 如果出现下图说明还没有安装,点击安装 同意协议: 稍等片刻.. ...

  3. CRM 线索 客户 统称为 资源 客户服务管理篇 销售易

    线索 客户 统称为 资源 - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E7%BA%BF%E7%B4%A2+% ...

  4. 阿里云 商标 SAAS

    商标注册-注册商标查询-商标交易平台-阿里云商标https://tm.aliyun.com/#/ 阿里云商标查询入口-云栖社区-阿里云https://yq.aliyun.com/articles/69 ...

  5. 分析imx8mm-evk评估板的pinctrl设备树

    1. 分析arch/arm64/boot/dts/freescale/imx8mm-evk.dts中的i2c3相关的pinctrl_i2c3节点 pinctrl_i2c3: i2c3grp { fsl ...

  6. ISO/IEC 9899:2011 条款6.7.7——类型名

    6.7.7 类型名 语法 1.type-name: specifier-qualifier-list    abstract-declaratoropt abstract-declarator: po ...

  7. python3以post方式提交数据

    # !/usr/bin/python # encoding:utf-8 import requests #下面替换成您的数据 postdata={'name':'xiaochong'} r=reque ...

  8. linux安装Erlang

    Erlang一种通用的面向并发的编程语言. 1.安装Erlang编译依赖: yum -y install gcc glibc-devel make ncurses-devel openssl-deve ...

  9. setInterval调用ajax回调函数不执行的问题

    setInterval调用ajax回调函数不执行 1.首先检查你的setInterval()函数写法是否正确 参考写法 // 检查是否支付成功 var isPayRequest=false; var ...

  10. Spring cloud微服务安全实战-_5-10实现基于session的SSO(Token有效期)

    refresh_token过期了怎么办,虽然可以设置一个比较长的有效期,但是终归还是要过期的. 只能从认证服务器重新走认证授权的流程. 两种情况 1,session还没过期的,跳过去之后,直接就知道你 ...