在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)
原文:在论坛中出现的比较难的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.先建立一个函数,通过分隔符来拆分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.第1个查询
-
SELECT s.id,
-
s.keywords
-
-
FROM 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.id
-
-
WHERE charindex(s.col,'机动车行驶超过规定时速50%以上不到100%的') > 0
-
-
GROUP BY s.id,
-
s.keywords
-
HAVING count(*) = max(ss.split_str_count) --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
第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.keywords
-
-
FROM 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.id
-
-
WHERE charindex(s.col,'机动车违反禁令标志的') > 0
-
-
GROUP BY s.id,
-
s.keywords
-
HAVING count(*) = max(ss.split_str_count) --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
第3个查询:
-
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.keywords
-
-
FROM 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.id
-
-
WHERE charindex(s.col,'违反规定停放、临时停车且驾驶人不在现场或驾驶人虽在现场拒绝立即驶离,妨碍其他车辆、行人通行的就能获取到') > 0
-
-
GROUP BY s.id,
-
s.keywords
-
HAVING count(*) = max(ss.split_str_count) --比如第一条记录拆分成了2个关键词,那么在匹配时要2个都匹配上了,才算为匹配
-
在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- Nexus3.X忘记admin密码找回
一.问题背景 nexus3 这种东西,传完一次,很少动了,很容易忘记密码,不要急有方法找回. 官方网站关于解决该问题的方法: https://support.sonatype.com/hc/en-us ...
- Android studio -SVN 使用笔记
1.Android studio 安装 中文组官网:http://www.android-studio.org/ 常见问题参考: 分支冲突合并 http://blog.csdn.net/tearsmo ...
- Java基础 main 参数String[] args的用法
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- spring boot集成Websocket
websocket实现后台像前端主动推送消息的模式,可以减去前端的请求获取数据的模式.而后台主动推送消息一般都是要求消息回馈比较及时,同时减少前端ajax轮询请求,减少资源开销. spring boo ...
- RHEL7 的注册
RHEL7 的注册 2016年09月12日 20:37:19 wojiushiwoba 阅读数 13002更多 分类专栏: 嵌入式linux 版权声明:本文为博主原创文章,遵循CC 4.0 BY- ...
- 邪淫真正的可怕危害 (转自学佛网:http://www.xuefo.net/nr/article54/544414.html)
邪淫真正的可怕危害 邪淫的害处可能很快就显现,也可能是逐渐的表现出来.但往往后者的害处更大.因为当积累了多年的邪淫果报一旦显现,后悔就已经晚了. 我本人就是一个很好的例子.回想自己这40多年的日子,邪 ...
- 报错:Error, CM server guid updated, expected xxxxx, received xxxxx (未解决)
报错背景: CDH断电重启后,cloudera-scm-server启动报错, cloudera-scm-server 已死,但 pid 文件仍存 由于没有成熟的解决方案,于是我就重新安装了MySQL ...
- 数据库分库分表中间件ShardingSphere推荐
官网链接:http://shardingsphere.io/document/current/cn/overview/ 源起: 我今天首先去了解了一下国内好像是比较火的一个叫"MyCat&q ...
- C# .NET UDP 形式调用 graylog,gelf
-- 发送: GelfLogModel m = new GelfLogModel(); m.version = "1.1"; m.host = "128.0.14.39& ...
- MySQL索引对NULL值的处理
# 索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的.所以我们在数据库设计时不要让字段的默认值为NU ...