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 に答える