首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

SQL,小弟我需要对一个字段进行截取的正则处理,但是效率有些慢

2013-09-07 
SQL,我需要对一个字段进行截取的正则处理,但是效率有些慢SQL,我需要对一个字段进行截取的正则处理,但是效

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 语句是否以%符号开头,差别巨大”的结论。而没有基础知识的人,只能被别人骂了以后去死记硬背,如果碰到这人愤青反而骂了也没有效果。因此,从适宜提高效率的角度去理解一些数据库原理,才能真正提高数据库编程效率。



sql的问题解决了,再说查询完毕数据库之后的处理。

在一般的字符串处理中随随便便使用所谓“正则”是与上面类似的、容易变成恶俗的写法。学过一点编译原理的人知道词法分析的原理,因此知道词法分析的代价多么巨大,所以不会在根本不适合使用词法分析时去滥用正则表达式。

在http的路径中只有参数才以?号开始,因此你只要

var pos = url.IndexOf('?');
if(pos<0)
   pos = url.IndexOf('#');
........
if(url.EndWith("/"))
  ........
这样的处理就非常好。
[解决办法]
楼上说得有道理
[解决办法]
在写入SQL语句之前处理比较容易且有多种方式可采用,如:var aaa = "http://www.baidu.com/abc.html?eee".Split(new char[2] { '?','#'})[0];

热点排行