今天在论坛上看到有一位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
如有不妥之处,欢迎各位大侠指正,不胜感激。