2012-03-16 11 views
7

當我比較SQL Server中的兩個字符串時,有幾個簡單的方法與=LIKE如何比較兩個字符串在SQL Server 2008的T-SQL中是否包含相同的單詞?

我要重新定義平等:

如果兩個字符串包含相同的話 - 不管以什麼順序 - 他們是平等的,否則他們是不會。

例如:

  • 'my word''word my'相等
  • 'my word''aaamy word'

什麼是對這個問題的最好簡單的解決方案?

+0

1)不區分大小寫的事?最有可能不是,但我想問,我應該問。 2)在另一個計數中存在的一個組中重複項目是否匹配?意思是說,「我的話」是否等於「說我的話」? – 2012-03-19 12:33:24

回答

4

我不認爲有一個簡單的解決方案,用於在SQL Server中嘗試執行的操作。我首先想到的是創建一個CLR UDF是:

  1. 接受兩個字符串
  2. 人把它們打破成兩個陣列使用的「」
  3. 比較兩個數組的內容,返回如果真的分割功能它們包含相同的元素。

如果這是您想要前往的路線,請查看this article以開始創建CLR UDF。

0

您可以在INSERT/UPDATE觸發器(或UDF默認值)中計算的基表中添加一個預計算列,用於拆分,排序並連接來自原始列的單詞。

然後使用=來比較這些預先計算的列。

1

情景如下。你會希望使用TVF在空間上分割第一個和第二個字符串,然後full join由此產生兩個值表,如果左側或右側有空值,則表示不平等,否則它們相等。

0

有一個名爲http://www.sqlsharp.com/的庫,它包含了一整套有用的字符串/數學函數。

它有一個名爲String_CompareSplitValues的函數,它正是你想要的。

我不確定它是社區版本還是付費版本。

0
declare @s1 varchar(50) = 'my word' 
declare @s2 varchar(50) = 'word my' 

declare @t1 table (word varchar(50)) 

while len(@s1)>0 
begin 
    if (CHARINDEX(' ', @s1)>0) 
    begin  
     insert into @t1 values(ltrim(rtrim(LEFT(@s1, charindex(' ', @s1)))))   
     set @s1 = LTRIM(rtrim(right(@s1, len(@s1)-charindex(' ', @s1)))) 
    end 
    else 
    begin 
     insert into @t1 values (@s1) 
     set @s1=''  
    end  
end 

declare @t2 table (word varchar(50)) 
while len(@s2)>0 
begin 
    if (CHARINDEX(' ', @s2)>0) 
    begin  
     insert into @t2 values(ltrim(rtrim(LEFT(@s2, charindex(' ', @s2)))))   
     set @s2 = LTRIM(rtrim(right(@s2, len(@s2)-charindex(' ', @s2)))) 
    end 
    else 
    begin 
     insert into @t2 values (@s2) 
     set @s2=''  
    end  
end 

select case when exists(SELECT * FROM @t1 EXCEPT SELECT * FROM @t2) then 'are not' else 'are equal' end 
+0

這不是單行查詢的答案 – 2016-08-17 05:32:10

2

試試這個... StringSorter函數在空間上打斷字符串,然後對所有單詞進行排序,然後按照排序的單詞順序將字符串放回到一起。

CREATE FUNCTION dbo.StringSorter(@sep char(1), @s varchar(8000)) 
RETURNS varchar(8000) 
AS 
BEGIN 
    DECLARE @ResultVar varchar(8000); 

    WITH sorter_cte AS (
     SELECT CHARINDEX(@sep, @s) as pos, 0 as lastPos 
     UNION ALL 
     SELECT CHARINDEX(@sep, @s, pos + 1), pos 
     FROM sorter_cte 
     WHERE pos > 0 
    ) 
    , step2_cte AS (
    SELECT SUBSTRING(@s, lastPos + 1, 
      case when pos = 0 then 80000 
      else pos - lastPos -1 end) as chunk 
    FROM sorter_cte 
    ) 
    SELECT @ResultVar = (select ' ' + chunk 
            from step2_cte 
            order by chunk 
            FOR XML PATH('')); 
    RETURN @ResultVar; 
END 
GO 

下面是一個測試用例只是想出來的功能:

SELECT dbo.StringSorter(' ', 'the quick brown dog jumped over the lazy fox'); 

其產生這些結果:

brown dog fox jumped lazy over quick the the 

然後從SELECT語句中使用字符串運行

SELECT case when dbo.StringSorter(' ', 'my word') = 
        dbo.StringSorter(' ', 'word my') 
       then 'Equal' else 'Not Equal' end as ResultCheck 
SELECT case when dbo.StringSorter(' ', 'my word') = 
        dbo.StringSorter(' ', 'aaamy word') 
       then 'Equal' else 'Not Equal' end as ResultCheck 

第一次e表明他們是平等的,而第二個則沒有。

這應該做你正在尋找與一個簡單的函數利用遞歸CTE排序你的字符串。

享受!

1

一個非常簡單的方法來做到這一點... JC65100

ALTER FUNCTION [dbo].[ITS_GetDifCharCount] 
(
@str1 VARCHAR(MAX) 
,@str2 VARCHAR(MAX) 
) 
RETURNS INT 
AS 
BEGIN 
DECLARE @result INT 

SELECT @result = COUNT(*) 
FROM dbo.ITS_CompareStrs(@str1,@str2) 

RETURN @result 

END 


ALTER FUNCTION [dbo].[ITS_CompareStrs] 
(
@str1 VARCHAR(MAX) 
,@str2 VARCHAR(MAX) 
) 
RETURNS 
@Result TABLE (ind INT, c1 char(1), c2 char(1)) 
AS 
BEGIN 
    DECLARE @i AS INT 
      ,@c1 CHAR(1) 
      ,@c2 CHAR(1) 

    SET @i = 1 

    WHILE LEN (@str1) > @i-1 OR LEN (@str2) > @i-1 
    BEGIN 

     IF LEN (@str1) > @i-1 
     SET @c1 = substring(@str1, @i, 1) 

     IF LEN (@str2) > @i-1 
     SET @c2 = substring(@str2, @i, 1) 

     INSERT INTO @Result([ind],c1,c2) 
     SELECT @i,@c1,@c2 

     SELECT @[email protected]+1 
       ,@c1=NULL 
       ,@c2=NULL 

    END 

    DELETE FROM @Result 
    WHERE c1=c2 


RETURN 
END 
相關問題