利用表变量和spt_values表来比较两个字串是否相等 .

上一篇 / 下一篇  2012-03-20 15:29:12 / 个人分类:数据库知识

 

利用表变量和spt_values表来比较两个字串是否相等

      今天在论坛上看到有一位C友提问,如何判断两组字符串是否相等的问题,刚好把手头的工作忙完,就写了一个函数,测试了一下,感觉没什么问题,大家也可以测试一下,有问题请留言给我。

      先看表结构和测试数据: 

ifobject_id('[tb]')isnotnulldroptable[tb]
go
createtable[tb]([col1]varchar(9),[col2]varchar(9))
insert[tb]
select'LGALGDLGU','LGALGDLGU'unionall
select'LGALGDLGU','LGALGULGD'unionall
select'LGALGDLGU','LGDLGALGU'unionall
select'LGALGDLGU','LGDLGULGA'unionall
select'LGALGDLGU','LGULAGLGD'unionall
select'LGALGDLGU','LGULGDLGA'
go
 

     数据中不管顺序,只要字符排序后是一样的,就认为是相等的,所以我们不能使用字符函数直接来比较,我的思路大概就是把每个字串放到一个表中,但由于有些字符在串中有重复,所以还得统计他们的个数,所以如果两个字符串相等,最少得满足两个条件:1、两个字符串的不同的字符个数要相等;2、每个字符出现的个数要相等。

    以下是我写的函数: 

createfunctionstr_def(@s1varchar(100),@s2varchar(100))
returnsint
as
begin
 declare@resultint
 declare@t1table(colchar(1))
 declare@t2table(colchar(1))
 insert@t1
 selectsubstring(@s1,number,1)
 frommaster..spt_values
 wheretype='P'andnumberbetween1andlen(@s1)
 insert@t2
 selectsubstring(@s2,number,1)
 frommaster..spt_values
 wheretype='P'andnumberbetween1andlen(@s2)
 ifnotexists
  (
   select1
   from(selectcol,count(1)ascntfrom@t1groupbycol)a
   wherenotexists
    (
     select1
     from(selectcol,count(1)ascntfrom@t2groupbycol) b
     wherea.col=b.colanda.cnt=b.cnt
    )
  )
   set@result=1
 else
   set@result=0
 return@result
end
go
 
-->查询
select*,dbo.str_def(col1,col2)ASRESULT fromtb
-->测试结果:
/*
col1      col2      RESULT
--------- --------- -----------
LGALGDLGU LGALGDLGU 1
LGALGDLGU LGALGULGD 1
LGALGDLGU LGDLGALGU 1
LGALGDLGU LGDLGULGA 1
LGALGDLGU LGULAGLGD 1
LGALGDLGU LGULGDLGA 1

(6 行受影响)

*/

dropfunctionstr_def

    如有不妥之处,欢迎各位大侠指正,不胜感激。


TAG:

 

评分:0

我来说两句

Open Toolbar