表 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 中所有行中不等于表 2 Column_B 中任何值的任何子字符串。例如,在第 1 行中,“eta”和“good”将被删除。
- 对表 1 中的所有剩余行重复该过程,直到删除所有无效子字符串。
最佳答案
试试这个 -
查询:
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
关于sql-server - 如何使用 T-SQL 删除列中不需要的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034911/