您的位置:首页 > 产品设计 > UI/UE

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

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

先看表结构和测试数据:

if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([col1] varchar(9),[col2] varchar(9))
insert [tb]
select 'LGALGDLGU','LGALGDLGU' union all
select 'LGALGDLGU','LGALGULGD' union all
select 'LGALGDLGU','LGDLGALGU' union all
select 'LGALGDLGU','LGDLGULGA' union all
select 'LGALGDLGU','LGULAGLGD' union all
select 'LGALGDLGU','LGULGDLGA'
go
数据中不管顺序,只要字符排序后是一样的,就认为是相等的,所以我们不能使用字符函数直接来比较,我的思路大概就是把每个字串放到一个表中,但由于有些字符在串中有重复,所以还得统计他们的个数,所以如果两个字符串相等,最少得满足两个条件:1、两个字符串的不同的字符个数要相等;2、每个字符出现的个数要相等。

以下是我写的函数:

create function str_def(@s1 varchar(100),@s2 varchar(100))
returns int
as
begin
declare @result int
declare @t1 table(col char(1))
declare @t2 table(col char(1))
insert @t1
select substring(@s1,number,1)
from master..spt_values
where type='P' and number between 1 and len(@s1)
insert @t2
select substring(@s2,number,1)
from master..spt_values
where type='P' and number between 1 and len(@s2)
if not exists
(
select 1
from (select col,count(1) as cnt from @t1 group by col) a
where not exists
(
select 1
from (select col,count(1) as cnt from @t2 group by col) b
where a.col=b.col and a.cnt=b.cnt
)
)
set @result=1
else
set @result=0
return @result
end
go
-->查询
select *,dbo.str_def(col1,col2) AS RESULT from tb
-->测试结果:
/*
col1 col2 RESULT
--------- --------- -----------
LGALGDLGU LGALGDLGU 1
LGALGDLGU LGALGULGD 1
LGALGDLGU LGDLGALGU 1
LGALGDLGU LGDLGULGA 1
LGALGDLGU LGULAGLGD 1
LGALGDLGU LGULGDLGA 1

(6 行受影响)

*/

drop function str_def

如有不妥之处,欢迎各位大侠指正,不胜感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: