sql语句优化!case when (A.f1=SUBSTRING(b.f1,1,1) or A.f1=SUBSTRING(b.f1,2,1) or A.f1=

doubagui 2010-08-19 03:19:46
将A表,B表的字段进行比较,如果A表字符包含于B表中(A表字段为1个字符,B表3个字符)则加1,如下:
case when (A.f1=SUBSTRING(b.f1,1,1) or A.f1=SUBSTRING(b.f1,2,1) or A.f1=SUBSTRING(b.f1,3,1) ) then 1 else 0 end
实现本语句的功能,能否优化提高速度,或者用其他简单快速一点的语句代替?因为有许多字段和记录要比较,速度较慢!
...全文
237 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dichun 2010-08-22
  • 打赏
  • 举报
回复
如果是必须要比较的,建议在设计表的时候增加一个计算字段,然后建立索引,速度肯定比上述多快;
menggang9801 2010-08-21
  • 打赏
  • 举报
回复
顶一个中心
APOLLO_TS 2010-08-20
  • 打赏
  • 举报
回复
不知道你怎么测的!差距很明显!

(512 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 2 毫秒。

(512 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 100 毫秒。
feilniu 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 doubagui 的回复:]

引用 4 楼 feilniu 的回复:
引用 1 楼 shenzhennba 的回复:

case when (A.f1=SUBSTRING(b.f1,1,1) or A.f1=SUBSTRING(b.f1,2,1) or A.f1=SUBSTRING(b.f1,3,1) ) then 1 else 0 end

这个估计快点, 只要A.f1包含于b.f1中 就...

case ……
[/Quote]

跟两个表上的索引有关系。
估计是A.f1字段上有索引起了作用。
doubagui 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 feilniu 的回复:]
引用 1 楼 shenzhennba 的回复:

case when (A.f1=SUBSTRING(b.f1,1,1) or A.f1=SUBSTRING(b.f1,2,1) or A.f1=SUBSTRING(b.f1,3,1) ) then 1 else 0 end

这个估计快点, 只要A.f1包含于b.f1中 就...

case when patIndex('%'+A.f1……
[/Quote]我运行结果是原来的快一点,其次是case when CHARINDEX(A.f1,b.f1)>0 then 1 else 0 end,case when patIndex('%'+A.f1+'%',b.f1)>0 then 1 else 0 end又慢一点
feilniu 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shenzhennba 的回复:]

case when (A.f1=SUBSTRING(b.f1,1,1) or A.f1=SUBSTRING(b.f1,2,1) or A.f1=SUBSTRING(b.f1,3,1) ) then 1 else 0 end

这个估计快点, 只要A.f1包含于b.f1中 就...

case when patIndex('%'+A.f1+'%',b.f1)>0 then 1 else 0……
[/Quote]

明明CHARINDEX更直观,效率也高一点:

case when CHARINDEX(A.f1,b.f1)>0 then 1 else 0 end
doubagui 2010-08-19
  • 打赏
  • 举报
回复
经验证两位朋友给的方法没有原来的方法快,谢谢!
APOLLO_TS 2010-08-19
  • 打赏
  • 举报
回复
declare @A table(Name varchar(50))
insert into @A select '赵'
insert into @A select '钱'
insert into @A select '孙'
insert into @A select '李'
insert into @A select '周'
insert into @A select '吴'
insert into @A select '郑'
insert into @A select '王'
declare @B table(Name varchar(50))
insert into @B select '赵本山'
insert into @B select '钱学森'
insert into @B select '孙继海'
insert into @B select '李全'
select case when (CHARINDEX(A.Name, B.Name)>0) then 1 else 0 end,A.Name,B.Name from @A A,@B B
shenzhenNBA 2010-08-19
  • 打赏
  • 举报
回复
case when (A.f1=SUBSTRING(b.f1,1,1) or A.f1=SUBSTRING(b.f1,2,1) or A.f1=SUBSTRING(b.f1,3,1) ) then 1 else 0 end

这个估计快点, 只要A.f1包含于b.f1中 就...

case when patIndex('%'+A.f1+'%',b.f1)>0 then 1 else 0 end

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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