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

generhappy 2013-08-17 11:36:59
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能做到,就是数据量大的时候效率慢,请问应该怎么弄
...全文
558 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在写入SQL语句之前处理比较容易且有多种方式可采用,如:var aaa = "http://www.baidu.com/abc.html?eee".Split(new char[2] { '?','#'})[0];
myhope88 2013-08-23
  • 打赏
  • 举报
回复
楼上说得有道理
  • 打赏
  • 举报
回复
可能有人说“我用%做开头不是功能很强大吗?”。这种貌似很有理由的做法,背后往往反而是对深层一点的实现机制不了解。 学习过《数据库设计原理》(而不是仅仅会使用某种关系数据库)的人,因为学习过数据库表达数据的数据结构、 表达B+树索引的数据结构和算法等等,因此他“凭感觉”就立刻接受了“like 语句是否以%符号开头,差别巨大”的结论。而没有基础知识的人,只能被别人骂了以后去死记硬背,如果碰到这人愤青反而骂了也没有效果。因此,从适宜提高效率的角度去理解一些数据库原理,才能真正提高数据库编程效率。 sql的问题解决了,再说查询完毕数据库之后的处理。 在一般的字符串处理中随随便便使用所谓“正则”是与上面类似的、容易变成恶俗的写法。学过一点编译原理的人知道词法分析的原理,因此知道词法分析的代价多么巨大,所以不会在根本不适合使用词法分析时去滥用正则表达式。 在http的路径中只有参数才以?号开始,因此你只要
var pos = url.IndexOf('?');
if(pos<0)
   pos = url.IndexOf('#');
........
if(url.EndWith("/"))
  ........
这样的处理就非常好。
  • 打赏
  • 举报
回复
引用 5 楼 jshi123 的回复:
如果Talk_Source都是以http://打头的,那么like表达式不要以%开头。以%开头会慢很多,而%在结尾的话可以利用到索引。
同意! 观察like表达式中是否随便在开头写上%,曾经作为我们衡量一个sql设计者的知识训练的不同程度的主要指标。
jshi123 2013-08-23
  • 打赏
  • 举报
回复
你写的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%'
jshi123 2013-08-23
  • 打赏
  • 举报
回复
如果Talk_Source都是以http://打头的,那么like表达式不要以%开头。以%开头会慢很多,而%在结尾的话可以利用到索引。 Project_ID=1, Visit_Start 和Talk_Source都必须加上索引! http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx
  • 打赏
  • 举报
回复
数据量大的话,可以采取分页,每次只处理固定数量的数据,而不是全部.
generhappy 2013-08-22
  • 打赏
  • 举报
回复
没有人回答么,在线求结果啊!!!
买个鸭脖子 2013-08-18
  • 打赏
  • 举报
回复
你这个最好交给程序来处理,因为数据量大的话,查询就已经会慢了 你这样还要做计算的话,就更慢 一般来说,尽量减少在sql语句中做太多的运算。

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧