最近,在论坛中,遇到了不少比较难的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(字符分拆 多关键字匹配问题)
原文:https://www.cnblogs.com/lonelyxmas/p/12020000.html