TSQL函数比较两个字符串

时间:2012-11-13 01:52:56

标签: sql sql-server user-defined-functions

任何人都可以给我一些示例TSQL代码来比较两个电子邮件地址,以检查它们是否相等?

CLR功能不是一种选择。我试过了,但我们的DBA由于某种原因完全反对在SSMS中使用CLR功能。

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

真的很感激任何建议 提前致谢

5 个答案:

答案 0 :(得分:7)

在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

答案 1 :(得分:6)

不确定你在寻找什么。根据您的问题,我了解您需要检查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

拉​​吉

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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 :(得分:0)

-patindex()函数如何?
-小例子:

model small
.stack 100H
.data

hexnumber db 10,13,'Enter a hex digit: $'
continue db 10,13,'Do you want to continue?: $'
errormsg db 10,13,'Illegal character, Enter 0..9 or A..F: $'
decimalnumber db 10,13,'In decimal it is: $'

.code
MAIN PROC
    mov ax,@data
    mov ds,ax

continue:   ; start of loop
            mov ah,9
            mov dx,offset hexnumber
            int 21h
            mov ah,1
            int 21h
            mov cl,al

legal:      ;Compare input to see if its less than 00H if its greater 
            ;than AAH
            cmp cl,00h   ;cl < 00h
            jl  end_if   ;yes, error msg

            cmp cl,AAh   ;compare cl >AAhh
            jg  end_if   ;yes, error msg

            jmp finally

end_if:               
            mov ah,9
            lea dx,errormsg ; print error message
            int 21h

            jmp continue ; reenter a hex number

            jmp legal    ; jump back to test
finally:                                               
            ; determine if number ; 0..9 and display
            mov ah,9
            lea dx,decimalnumber ; display decimalnumber
            int 21h

            mov ah,2
            mov dl,cl    ;display number          
            int 21h

            ; determine if number a..f and display
            mov ah,9 
            lea dx,decimalnumber  ; display decimalnumber
            int 21h

            mov ah,2
            mov dl,cl  ; display MSB for 'A' to ;'F'              
            int 21h

            mov ah,2
            sub cl,11H       ; displayLSBfor'A'to'F' 
            int 21h
            mov ah,9
            lea dx,continue     ; display continue 
            int 21h
            mov ah,1
            int 21h
            mov bl,al
            cmp bl,'Y'           ;bl = Y
            jne eoj              ;no, end

            je continue          ;yes, loop back

eoj:        ; return to DOS prompt
            mov ah,4ch
            int 21h
main endp
end MAIN