日期:2014-05-17  浏览次数:20377 次

SQL,我需要对一个字段进行截取的正则处理,但是效率有些慢
SQL,我需要对一个字段进行截取的正则处理,但是效率有些慢,是一个url字段,我需要将后面的参数去掉,可能是?也有可能是#,然后如果最后一位是/,再去掉这个/,我是这样写的

select left(talk_source,LEN(Talk_source)-CHARINDEX('?',REVERSE(Talk_source))) as Talk_source2,* 
from Zoosnet_Data 
where Project_ID=1 and (Zoosnet_Visit_Start_Time between '2013-1-1' and '2013-8-1') 
and Zoosnet_Data.Talk_Source like '%http://www.baidu.com/abc.html?eee%'


数据里的域名可能是
http://www.baidu.com/abc.html?eee
http://www.baidu.com/abc.html#wedf
http://www.baidu.com/wer/hjk.html#whhhf
http://www.baidu.com/abc/ggg/
我需要截取成
http://www.baidu.com/abc.html
http://www.baidu.com/abc.html
http://www.baidu.com/wer/hjk.html
http://www.baidu.com/abc/ggg

我上面的SQL能做到,就是数据量大的时候效率慢,请问应该怎么弄

------解决方案--------------------
你这个最好交给程序来处理,因为数据量大的话,查询就已经会慢了
你这样还要做计算的话,就更慢

一般来说,尽量减少在sql语句中做太多的运算。
------解决方案--------------------
如果Talk_Source都是以http://打头的,那么like表达式不要以%开头。以%开头会慢很多,而%在结尾的话可以利用到索引。
Project_ID=1, Visit_Start 和Talk_Source都必须加上索引!
http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx

------解决方案--------------------
你写的sql好像只能处理问号, 处理#,/可以这样写:
select replace(replace(left(talk_source, patindex('%[?#]%', 
talk_source+'?')-1)+'$$','/$$',''),'$$','') as Talk_source2,* 
from Zoosnet_Data 
where Project_ID=1 and (Zoosnet_Visit_Start_Time between '2013-1-1' and '2013-8-1') 
and Zoosnet_Data.Talk_Source like 'http://www.baidu.com/abc.html?eee%'

------解决方案--------------------
引用:
如果Talk_Source都是以http://打头的,那么like表达式不要以%开头。以%开头会慢很多,而%在结尾的话可以利用到索引。


同意!

观察like表达式中是否随便在开头写上%,曾经作为我们衡量一个sql设计者的知识训练的不同程度的主要指标。
------解决方案--------------------
可能有人说“我用%做开头不是功能很强大吗?”。这种貌似很有理由的做法,背后往往反而是对深层一点的实现机制不了解。

学习过《数据库设计原理》(而不是仅仅会使用某种关系数据库)的人,因为学习过数据库表达数据的数据结构、
表达B+树索引的数据结构和算法等等,因此他“凭感觉”就立刻接受了“like 语句是否以%符号开头,差别巨大”的结论。而没有基础知识的人,只能被别人骂了以后去死记硬背,如果碰到这人愤青反而骂了也没有效果。因此,从适宜提高效率的角度去理解一些数据库原理,才能真正提高数据库编程效率。