比较两个字符串的 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把“sofia”和“sofia”一样对待?这是啥字符串编码?