簡體   English   中英

計算 SQL Server 中兩個字符串之間的常見字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM