sql-server - 如何使用 T-SQL 删除列中不需要的子字符串

标签 sql-server t-sql substring

表 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 中的所有剩余行重复该过程,直到删除所有无效子字符串。

最佳答案

试试这个 -

查询:

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/

相关文章:

sql - 防止 SQL 数据库中的数据欺诈和删除

sql - 强制 Count 中出现零

sql-server - SQL Server提取 "like substring"

sql-server - 将缺失记录添加到结果表记录中

java - 如何获取用户输入的字符串中 ""之间的内容? java

text - 删除属于其他字符串的子字符串

c# - 是否可以异步提交/回滚 SqlTransaction?

mysql - SQL 查询不工作。 Count 也应该返回零。但即使在外部加入后也不工作

sql - 有哪些工具可以测试SQL语句的性能?

java - 在字符串中搜索未知模式的最有效方法?