[英]Count common characters between two string in SQL Server
我需要一些有關 SQL 語句的幫助。
我想計算字符串 A 和 B 之間的常見字符。我有這樣的表格。
A B Result
---------------------
13456 124 2
13478 344 2
79105 782 1
12457 983 0
41295 129 3
43134 343 2
86761 676 2
55444 545 2
我怎樣才能做到這一點?
沿着這些路線的標量值函數可以完成這項工作,既粗糙又骯臟:
CREATE FUNCTION dbo.CountCommonChars (
@var1 varchar(10),
@var2 varchar(10)
)
RETURNS INT
AS
BEGIN
declare @i int = 0,
@s char(1) = '',
@t int = 0
while @i<=9
begin
set @s = convert(char(1),@i)
set @t = @t + (case when charindex(@s,@var1)>0
and charindex(@s,@var2)>0 then 1 else 0 end)
set @i=@i+1
end
RETURN @t;
END
然后是這樣的:
select dbo.CountCommonChars('12345','316')
將導致 2. 所以你的最終查詢可能是:
select A, B, Result = dbo.CountCommonChars(A,B)
from tbl
計數表在這里非常有用。 我在我的系統上保留一個作為視圖。 這是我的計數表的代碼。 它速度超快,讀取次數為零。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
在我們做任何事情之前,我們需要一些樣本數據。 為了演示方便,我把它放到了一個表變量中。
declare @Something table (String1 varchar(10), String2 varchar(10))
insert @Something values
('13456', '124')
, ('13478', '344')
, ('79105', '782')
, ('12457', '983')
, ('41295', '129')
, ('43134', '343')
, ('86761', '676')
, ('55444', '545')
現在我們只需要利用這張表來發揮我們的優勢。 這會產生原始問題中所述的所需輸出。
select String1
, String2
, Result = sum(CharCount)
from
(
select String1
, String2
, Charcount = max(case when CHARINDEX(substring(String2, t.N, 1), String1, 0) > 0 then 1 else 0 end)
from @Something s
join cteTally t on t.N <= len(String2)
group by String1
, String2
, substring(String2, t.N, 1)
) x
group by String1
, String2
order by String1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.