CSDN-CSDN社区-MS-SQL Server-疑难问题

收藏 查找某个字符串第N次出现的位置[问题点数:100,结帖人:dber1]

  • dber1
  • (dber1)
  • 等 级:
  • 结帖率:
楼主发表于:2008-08-04 20:05:18
如何查找某个字符串第N次出现的位置,比如:字符串"sdf_dsf_dfgdg_ertr_erte",要查找"f_"第二次出现的位置
回复次数:18
  • zhou968用户头像
  • zhou968
  • (☆子灵☆)
  • 等 级:
#1楼 得分:13回复于:2008-08-04 20:06:57
SQL code

if exists(select 1 from sysobjects where name='char_index')
drop function char_index 

create function char_index(@string varchar(8000),@char varchar(10),@index smallint)
--@string:待查找字符串,@index:查找位置
returns smallint
as
begin
  declare
  @i tinyint,--当前找到第@i个
  @position tinyint--所在位置
  set @position=@index;
  set @i=0;
  while charindex(@char,@string,@position)>0
  begin
    set @position=charindex(@char,@string,@position)+1;
    set @i=@i+1;
    if @i=@index
    begin
     return @position-1;
    end
  end
  return 0;--0表示未找到
end 

select dbo.char_index('sdf_dsf_dfgdg_ertr_erte','f_',2)



http://blog.csdn.net/zhou968/archive/2008/08/03/2760871.aspx
#2楼 得分:20回复于:2008-08-04 20:15:14
#3楼 得分:0回复于:2008-08-04 20:17:04
☆子灵☆小马队?:)
  • wufeng4552用户头像
  • wufeng4552
  • (【水族杰纶】)
  • 等 级:
  • 2

    2

    4

#4楼 得分:0回复于:2008-08-04 20:18:02
Mark
#5楼 得分:0回复于:2008-08-04 20:47:04
1楼2楼都强啊,这么快就给出答案了,我过程测试了下,似乎1楼的算法快很多啊,不知道我测试的准不准确.
SQL code

declare
@t datetime
set @t=getdate();
select dbo.f_findstr(collation,'_',2) from syscolumns,syscomments where syscolumns.id=syscomments.id
print datediff(ms,@t,getdate());
set @t=getdate();
select dbo.char_index(collation,'_',2) from syscolumns,syscomments where syscolumns.id=syscomments.id
print datediff(ms,@t,getdate());




结果是:
3460和1640
#6楼 得分:0回复于:2008-08-04 21:00:16
SQL code
if exists(select 1 from sysobjects where name='char_index')
drop function char_index 
go
create function char_index(@string varchar(8000),@char varchar(10),@index smallint)
--@string:待查找字符串,@index:查找位置
returns smallint
as
begin
  declare
  @i int,--当前找到第@i个
  @position int--所在位置
  set @position=@index;
  set @i=0;
  while charindex(@char,@string,@position)>0
  begin
    set @position=charindex(@char,@string,@position)+1;
    set @i=@i+1;
    if @i=@index
    begin
     return @position-1;
    end
  end
  return 0;--0表示未找到
end 
go
select dbo.char_index('aaaaaa','a',5)


0

不对
#7楼 得分:0回复于:2008-08-04 21:07:24
,,,
  • roy_88用户头像
  • roy_88
  • (中国风)
  • 等 级:
  • 2

    4

#8楼 得分:20回复于:2008-08-04 21:29:51
  • roy_88用户头像
  • roy_88
  • (中国风)
  • 等 级:
  • 2

    4

#9楼 得分:0回复于:2008-08-04 21:30:58
超出个数时为null
SQL code

declare @s nvarchar(100)
select @s='sdf_dsf_dfgdg_ertr_erte'
select dbo.F_Str(@s,5,'f_')


-----------
NULL

(1 行受影响)
  • hery2002用户头像
  • hery2002
  • (苦*行*僧)
  • 等 级:
  • 2

    2

#10楼 得分:0回复于:2008-08-04 22:07:18
收了 :)
#11楼 得分:0回复于:2008-08-04 22:08:16
引用 10 楼 hery2002 的回复:
收了 :)

收什么?破烂王啊
  • wufeng4552用户头像
  • wufeng4552
  • (【水族杰纶】)
  • 等 级:
  • 2

    2

    4

#12楼 得分:0回复于:2008-08-05 08:34:13
if exists(select * from sysobjects where name='Char_index')
  drop function Char_index
go
create function Char_index(@s varchar(8000),@c varchar(10))
returns smallint
as
begin
  declare @position tinyint
  set @position=1
  while charindex(@c,@s,@position)>0
  begin
      set @position=charindex(@c,@s,@position)+1
  end
    return @position -1
end
go
select dbo.char_index('sdf_dsf_dfgdg_ertr_erte','f')
  • zhou968用户头像
  • zhou968
  • (☆子灵☆)
  • 等 级:
#13楼 得分:40回复于:2008-08-05 08:41:08
#14楼 得分:5回复于:2008-08-05 09:02:11
呵呵,不好意思,我又测试了下.

SQL code

--这是找得到字符时的情况.
declare
@t datetime
set @t=getdate();
select collation,dbo.f_findstr(collation,'_',2) from syscolumns,syscomments
print datediff(ms,@t,getdate());
set @t=getdate();
select collation,dbo.char_index(collation,'_',2) from syscolumns,syscomments
print datediff(ms,@t,getdate());
set @t=getdate();
select collation,dbo.F_Str(collation,2,'_') from syscolumns,syscomments
print datediff(ms,@t,getdate());

--结果
/*
(所影响的行数为 55624 行)
2903
(所影响的行数为 55624 行)
2406
(所影响的行数为 55624 行)
2423
*/



SQL code

--这是找不到字符时的情况,查找第21个.
declare
@t datetime
set @t=getdate();
select collation,dbo.f_findstr(collation,'_',21) from syscolumns,syscomments
print datediff(ms,@t,getdate());
set @t=getdate();
select collation,dbo.char_index(collation,'_',21) from syscolumns,syscomments
print datediff(ms,@t,getdate());
set @t=getdate();
select collation,dbo.F_Str(collation,21,'_') from syscolumns,syscomments
print datediff(ms,@t,getdate());

--结果
/*
(所影响的行数为 55624 行)
5733
(所影响的行数为 55624 行)
2453
(所影响的行数为 55624 行)
2420
*/
--在这情况下第一个直接出错,返回的位置是8



SQL code

--这是找不到字符时的情况,查找第4个.
declare
@t datetime
set @t=getdate();
select collation,dbo.f_findstr(collation,'_',21) from syscolumns,syscomments
print datediff(ms,@t,getdate());
set @t=getdate();
select collation,dbo.char_index(collation,'_',21) from syscolumns,syscomments
print datediff(ms,@t,getdate());
set @t=getdate();
select collation,dbo.F_Str(collation,21,'_') from syscolumns,syscomments
print datediff(ms,@t,getdate());

--结果
/*
(所影响的行数为 55624 行)
2953
(所影响的行数为 55624 行)
2440
(所影响的行数为 55624 行)
2500
*/
--在这情况下第三个直接出错,返回的位置是18




在找得到的情况下,似乎 ☆子灵☆ 的最快,找不到的情况下越多找不到 中国风 的就越最快.
可是为什么有时候会出现错误呢?有没有高手帮忙解释下啊.
#15楼 得分:1回复于:2008-08-05 09:08:33
楼上的你又不是 楼主,测什么测哦。凑热闹。
#16楼 得分:1回复于:2008-08-05 10:55:44
没错,我就是凑热闹的.
#17楼 得分:0回复于:2008-10-08 13:58:09
强,收藏……
#18楼 得分:0回复于:2008-10-23 11:54:26
mark
相关问题
查找某个字符在字符串中第N次出现的位置
如何查找字符串中某一段特定字符串
返回一个字符串中的某个字符的位置用那个函数? VB / 基础类- CSDN社区 ...
怎么从右到左搜索一个字符串? VB / 基础类- CSDN社区community.csdn.net
请教:关于一个字符串的问题? VB / 非技术类- CSDN社区community.csdn.net
急啊...字符第N次出现位置Web 开发/ vbScript - CSDN社区community ...