一个SQL关于包含字符串的问题?

tsyd 2004-02-03 08:47:52
表TABLE有数据10万条以上

字段:
NAME A B C

现在要选出字段NAME不包含字段A、B、C三个字段中字符串的数据。

我已经写了一个但是执行速度很慢。

这个SQL要如何写才好?
...全文
1773 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiyunxia 2004-02-03
  • 打赏
  • 举报
回复
CHARINDEX
比LIKE效率高
caiyunxia 2004-02-03
  • 打赏
  • 举报
回复
CHARINDEX
realgz 2004-02-03
  • 打赏
  • 举报
回复
直接 top 1000 * 好象不会太慢吧,不过也要看你的具体数据就是了。。。反正怎么都有可能要把所有数据都 过滤一遍就是了。。。。
tsyd 2004-02-03
  • 打赏
  • 举报
回复
其实我这个做的就是人才网站中关于企业避讳的问题

简历中填写三个避讳的词,那企业在做人才查询的时候就查不出有避讳该企业的人才简历

有没有好的办法解决,只用查出符合条件的TOP 1000条,我这个查询太慢了
realgz 2004-02-03
  • 打赏
  • 举报
回复

print convert(varchar,getdate(),121)

select *
from #t
where not((NAME like '%' + A + '%') or (NAME like '%' + B + '%') or (NAME like '%' + C + '%'))
go
print convert(varchar,getdate(),121)

SELECT * from #t where CHARINDEX(A, name)=0 and CHARINDEX(B, name)=0 and CHARINDEX(C, name)=0
go

print convert(varchar,getdate(),121)
go
SELECT * from #t where not ( CHARINDEX(A, name)<>0 or CHARINDEX(B, name)<>0 or CHARINDEX(C, name)<>0)
print convert(varchar,getdate(),121)
go
set nocount off

/*
2004-02-03 09:29:00.817

2004-02-03 09:29:07.727

2004-02-03 09:29:13.223

2004-02-03 09:29:16.470
*/
realgz 2004-02-03
  • 打赏
  • 举报
回复
恐怕快不到哪里去。。。
条件 CHARINDEX(A, name)=0 and CHARINDEX(B, name)=0 and CHARINDEX(C, name)=0
好象已经得到最大优化了,
而平时我们要优化查询,无非就是 利用 索引减少 IO ,合理的逻辑节约运算,在这里好像都没折了。
realgz 2004-02-03
  • 打赏
  • 举报
回复
--原来我那个查询慢得离谱:)
--测试数据生成:
if object_id('tempdb..#t') is not null
drop table #t
go
create table #t (name varchar(80), a varchar(2),b varchar(3), c varchar(4) )
--create clustered index cc on #t (name)
go
insert into #t
select top 100000
nchar(19968+checksum(newid())%10000)+ nchar(19968+checksum(newid())%10000)+ nchar(19968+checksum(newid())%10000),
nchar(19968+checksum(newid())%10000), nchar(19968+checksum(newid())%10000), nchar(19968+checksum(newid())%10000)
from master..sysobjects s,master..sysobjects c
go

print convert(varchar,getdate(),121)
victorycyz 2004-02-03
  • 打赏
  • 举报
回复
这样的查询有点少见。

能不能说说你的实际的表结构及设计意图?
realgz 2004-02-03
  • 打赏
  • 举报
回复
--and try:

select a.*
from TABLE a,TABLE b,TABLE c
where
((a.NAME not like '%' + a.A + '%') and
((b.NAME not like '%' + b.b + '%') and
((c.NAME not like '%' + c.A + '%') and
a.name=b.name and a.name=c.name
realgz 2004-02-03
  • 打赏
  • 举报
回复
select a.*
from TABLE a,TABLE b,TABLE c
where
charindex(a.a,a.name) =0 and
charindex(b.b,b.name) =0 and
charindex(c.c,c.name) =0 and
a.name=b.name and a.name=c.name

如何?
czw1975 2004-02-03
  • 打赏
  • 举报
回复
SELECT * from table where CHARINDEX(A, name)=0 and CHARINDEX(B, name)=0 and CHARINDEX(C, name)=0
dulei115 2004-02-03
  • 打赏
  • 举报
回复
select *
from 表
where not((NAME like '%' + A + '%') or (NAME like '%' + B + '%') or (NAME like '%' + C + '%'))

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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