比较两个字符串的 TSQL 函数

Posted

技术标签:

【中文标题】比较两个字符串的 TSQL 函数【英文标题】:TSQL function to compare two strings 【发布时间】:2012-11-13 01:52:56 【问题描述】:

谁能给我一些示例 TSQL 代码来比较两个电子邮件地址以检查它们是否相等?

CLR 函数不是一个选项。我试过了,但我们的 DBA 出于某种原因完全反对在 SSMS 中使用 CLR 函数。

我知道如何从电子邮件地址获取域名(例如:mycompany.com)。

非常感谢任何建议 提前致谢

【问题讨论】:

err,您不需要 UDF 来比较两个字符串是否相等 - 使用 = 有什么问题? 比较是指相似还是相等? 您的问题是说您知道如何从电子邮件地址中获取域名 - 所以只需比较这些字符串?或者这是一个错字,你的意思是说你知道? 【参考方案1】:

不太确定您在寻找什么。根据您的问题,我了解到您需要检查 2 个电子邮件地址的相似性/不相似性。

为什么不能用这个?

declare @email1 varchar(100) set @email1 = 'billg@microsoft.com'
declare @email2 varchar(100) set @email2 = 'melinda@microsoft.com'
IF
@email1=@email2
BEGIN
    PRINT 'Same Email'
END
ELSE
BEGIN
    PRINT 'Not Same Email'
END

拉吉

【讨论】:

非常好的简单实现,但不考虑 CI 与 CS。如 Aleksandr 所述,使用校验和满足细化需求。【参考方案2】:

在 SQL Server 2005+ 中使用函数 CHECKSUM()

CHECKSUM 在其参数列表上计算一个哈希值,称为校验和。哈希值旨在用于构建哈希索引。如果 CHECKSUM 的参数是列,并且在计算的 CHECKSUM 值上构建索引,则结果是哈希索引。这可用于列上的相等搜索。 更多关于CHECKSUM()的信息

DECLARE @email1 varchar(100) = 'billg@microsoft.com'
DECLARE @email2 varchar(100) = 'melinda@microsoft.com'
SELECT CASE WHEN CHECKSUM(@email1) = CHECKSUM(@email2) THEN 'Same Email' 
                                                       ELSE 'Different Email' END

【讨论】:

【参考方案3】:

虽然这是一篇旧帖子,但我认为使用 CHECKSUM 对解决方案发表评论很重要。根据定义,校验和属于有限空间,因此具有有限数量的不同值。对于 32 位数字,有 4,294,967,295 个可能的值。我很想说当两个电子邮件地址产生相同的校验和时,只有 4,294,967,295 个可能的值会导致潜在的冲突。 Raj 建议的纯字符串比较 (email1 = email2) 可以防止这种冲突,因为电子邮件地址本质上是唯一的。

cf: [https://msdn.microsoft.com/en-us/library/ms189788(v=SQL.100).aspx?ranMID=24542&ranEAID=TnL5HPStwNw&ranSiteID=TnL5HPStwNw-pDIZxu_YsTXD2vBagzBEKA&tduid=(e03e708849bdae31622c749be9e951f9)(256380)(2459594)(TnL5HPStwNw-pDIZxu_YsTXD2vBagzBEKA)()][1]

[http://preshing.com/20110504/hash-collision-probabilities/][2]

【讨论】:

【参考方案4】:

--patindex() 函数呢? -- 小例子:

create table t1 (tkey integer, val nvarchar(20) )  
create table t2 (tkey integer, val nvarchar(20) )  
insert into t1 (tkey, val) values (1, 'abc' )  
insert into t1 (tkey, val) values (2, 'efgh' )  
insert into t1 (tkey, val) values (3, 'xyz' )  

insert into t2 (tkey, val) values (1, 'abc' )  
insert into t2 (tkey, val) values (2, '  efgh' )  
insert into t2 (tkey, val) values (3, 'xy z' )  


select t1.val, t2.val, patindex( t1.val, t2.val )  
from t1, t2  
where t1.tkey = t2.tkey  

【讨论】:

欢迎堆栈溢出,我建议您将代码格式化为代码。您可以选择代码并按 control + k 或将其缩进 4 个空格或将其插入两个反引号之间(alt + 96)【参考方案5】:

测试两个电子邮件地址是否具有相同的域:

declare @email1 varchar(100) set @email1 = 'billg@microsoft.com'
declare @email2 varchar(100) set @email2 = 'melinda@microsoft.com'

select 
  case when 
    right(@email1, len(@email1) - charindex('@', @email1)) =
    right(@email2, len(@email2) - charindex('@', @email2))
  then 'Same domain'
  else 'Different domains'
  end

【讨论】:

谢谢大家的回答。我得到了我想要的东西

以上是关于比较两个字符串的 TSQL 函数的主要内容,如果未能解决你的问题,请参考以下文章

TSQL:解析具有各种字符的字符串

如何将 Tsql 标量函数转换为表函数?

如何在 TSQL 函数中检查正确的日期时间格式?

为啥TSQL把“sofia”和“sofia”一样对待?这是啥字符串编码?

如何在 php 中为 tsql 字符串转义单引号(ms sql)

TSQL:是不是有更快或更好的加密值的方法?