在论坛中出现的比较难的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个都匹配上了,才算为匹配

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值