2

表 1 中有数千行包含许多未知和无效的子字符串。每个子字符串用逗号分隔,数据不区分大小写。

表 1(包含无效子串)

Row     COLUMN_A                
1   Beta, gamma, eta, lambda, good              
2   Alpha, beta,theta, zeta             
3   Alpha, sigma, beta, morning             
4   Delta, gamma, zeta, etc             
Etc…

表 2(包含所有有效子串)

COLUMN_B                    
alpha                   
beta                    
gamma                   
theta                   
lambda                  

将 Column_A 中每一行中的每个子字符串与 Column_B 中的所有值进行比较。

  1. 删除表 1 的所有行中不等于表 2 的 Column_B 中的任何值的任何子字符串。例如,在第 1 行中,“eta”和“good”将被删除。
  2. 对表 1 中的所有剩余行重复该过程,直到删除所有无效子字符串。
4

1 回答 1

2

试试这个——

询问:

DECLARE @string TABLE
(
      RowID INT
    , Value NVARCHAR(50)
)

INSERT INTO @string (RowID, Value)
VALUES 
    (1, 'Beta, gamma, eta, lambda, good'),             
    (2, 'Alpha, beta,theta, zeta'),   
    (3, 'Alpha, sigma, beta, morning'),             
    (4, 'Delta, gamma, zeta, etc')    

DECLARE @valid_substring TABLE (Value NVARCHAR(20))
INSERT INTO @valid_substring (Value)
VALUES ('alpha'),('beta'),('gamma'),('theta'),('lambda')

;WITH cte AS
(
    SELECT t2.*
    FROM (
        SELECT 
              t.RowID
            , token = 
                LTRIM(SUBSTRING(
                      t.Value
                    , number + 1
                    , ABS(CHARINDEX(',', t.Value, number + 1) - number - 1)))
        FROM (
            SELECT t.RowID, Value = ',' + t.Value
            FROM @string t
        ) t
        CROSS JOIN [master].dbo.spt_values n
        WHERE [type] = 'p'
            AND number <= LEN(t.Value) - 1
            AND SUBSTRING(t.Value, number, 1) = ','
    ) t2
    JOIN @valid_substring vs ON LOWER(t2.token) = LOWER(vs.value)
)
SELECT t.RowID, Value = STUFF((
            SELECT ', ' + token
            FROM cte t2
            WHERE t2.RowID = T.RowID
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')             
FROM (
    SELECT DISTINCT RowID 
    FROM cte
) t

输出:

RowID       Value
----------- ---------------------
1           Beta, gamma, lambda
2           Alpha, beta, theta
3           Alpha, beta
4           gamma
于 2013-06-11T05:41:21.893 回答