这个是一个csdn上有人问的一个题目,具体的题目如下:
数据库表 表1
id name
1 DB-235-aa-fc
2 DB-275-ag-fw
3 DB-235-ajj-fj
4 DB-4444444-ss-fq
5 DB-2222-kkk-fh
6 DB-997-ii-fw
. .
. .
里面几千,几万条
在数据库中写查询语句,查询name字段,第一个‘-’和第二个‘-’之间的最大的那个数!
也就是把第4条数据查询出来!
这里给出了两种解法:(1)是利用游标(在利用游标之前,会先过滤一下数据集,让数据集的记录变小,这样可以大大的缩小游标所花的时间)具体的Sql代码如下:
create table #t
(
id int not null identity(1,1) primary key,
name varchar(100) not null
)
insert #t(name)
values
('DB-235-aa-fc'),
('DB-275-ag-fw'),
('DB-235-ajj-fj'),
('DB-4444444-ss-fq'),
('DB-2222-kkk-fh'),
('DB-997-ii-fw')
--下面的select就是缩小了结果集
select *
into #lists
from #t
where len(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))
in(
select max(len(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))) from #t)
declare @name varchar(100)
declare @id int
declare @max int
set @max=-1
declare c cursor for
select * from #lists
open c
fetch next from c into @id,@name
while @@FETCH_STATUS=0
begin
set @name=SUBSTRING(@name,1,CHARINDEX('-',@name,4)-1)
set @name=SUBSTRING(@name,4,LEN(@name)-3)
if(CAST(@name as int)>@max)
begin
set @max=CAST(@name as int)
set @id=@id
end
fetch next from c into @id,@name
end
close c
deallocate c
select * from #lists
where id=@id
drop table #lists
drop table #t
方法2:直接的操作,利用MAX(int),Sql代码如下:
create table #t
(
id int not null identity(1,1) primary key,
name varchar(100) not null
)
insert #t(name)
values
('DB-235-aa-fc'),
('DB-275-ag-fw'),
('DB-235-ajj-fj'),
('DB-4444444-ss-fq'),
('DB-2222-kkk-fh'),
('DB-997-ii-fw')
select * from #t
where SUBSTRING(SUBSTRING(name,1,CHARINDEX('-',name,4)-1),4,LEN(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))-3)
in(
select max(CAST(SUBSTRING(SUBSTRING(name,1,CHARINDEX('-',name,4)-1),4,LEN(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))-3) AS int))
from #t
)
drop table #t
结果都是相同的:4 DB-4444444-ss-fq