當我比較SQL Server中的兩個字符串時,有幾個簡單的方法與=
或LIKE
。如何比較兩個字符串在SQL Server 2008的T-SQL中是否包含相同的單詞?
我要重新定義平等:
如果兩個字符串包含相同的話 - 不管以什麼順序 - 他們是平等的,否則他們是不會。
例如:
'my word'
和'word my'
相等'my word'
和'aaamy word'
不
什麼是對這個問題的最好簡單的解決方案?
當我比較SQL Server中的兩個字符串時,有幾個簡單的方法與=
或LIKE
。如何比較兩個字符串在SQL Server 2008的T-SQL中是否包含相同的單詞?
我要重新定義平等:
如果兩個字符串包含相同的話 - 不管以什麼順序 - 他們是平等的,否則他們是不會。
例如:
'my word'
和'word my'
相等'my word'
和'aaamy word'
不什麼是對這個問題的最好簡單的解決方案?
沒有簡單的方法來做到這一點。建議您編寫一個函數或存儲過程,以處理與此需求相關的任務。
你的函數可以使用的刺分成幾部分,排序的話等
這裏是你如何分割字符串的其他功能:
T-SQL: Opposite to string concatenation - how to split string into multiple records
我不認爲有一個簡單的解決方案,用於在SQL Server中嘗試執行的操作。我首先想到的是創建一個CLR UDF是:
如果這是您想要前往的路線,請查看this article以開始創建CLR UDF。
您可以在INSERT/UPDATE觸發器(或UDF默認值)中計算的基表中添加一個預計算列,用於拆分,排序並連接來自原始列的單詞。
然後使用=來比較這些預先計算的列。
情景如下。你會希望使用TVF在空間上分割第一個和第二個字符串,然後full join
由此產生兩個值表,如果左側或右側有空值,則表示不平等,否則它們相等。
有一個名爲http://www.sqlsharp.com/的庫,它包含了一整套有用的字符串/數學函數。
它有一個名爲String_CompareSplitValues的函數,它正是你想要的。
我不確定它是社區版本還是付費版本。
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
這不是單行查詢的答案 – 2016-08-17 05:32:10
試試這個... 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排序你的字符串。
享受!
一個非常簡單的方法來做到這一點... 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
1)不區分大小寫的事?最有可能不是,但我想問,我應該問。 2)在另一個計數中存在的一個組中重複項目是否匹配?意思是說,「我的話」是否等於「說我的話」? – 2012-03-19 12:33:24