即使与另一个列值部分匹配,也将特定字符串替换为空白

Shi*_*iva 0 sql-server string-manipulation

我有一个场景,如果部分单词与另一列匹配,则从一组逗号分隔的字符串中替换整个字符串。

我发现用文字解释非常复杂,因此我通过包含各种示例的屏幕截图进行了解释。

请帮助我使用存储过程或函数或查询来获取所需结果列中的结果,如下面的屏幕截图所示。

截屏

我尝试使用STRING_SPLIT函数来分割值并连接表。我对解决这个问题的逻辑感到震惊。

Pau*_*ite 7

样本数据

CREATE TABLE dbo.Test
(
    ID integer NOT NULL,
    Col1 varchar(8000) NOT NULL,
    Col2 varchar(8000) NOT NULL,
    Required_result varchar(8000) NULL
);

INSERT dbo.Test
    (ID, Col1, Col2)
VALUES
    (1, 'pencil red', 'charcoal, pencil, scale'),
    (2, 'pencil red', 'charcoal, red, scale'),
    (3, 'ball pen', 'eraser, pen'),
    (4, 'ball pen', 'ball, box'),
    (5, 'ball pen', 'eraser, ball pen'),
    (6, 'ball pen', 'eraser, pen ball'),
    (7, 'ball pen', 'eraser, watercan, bag'),
    (8, 'Note book', 'Note book'),
    (9, 'Note book', 'Note book, eraser'),
    (10, 'Note book', '');
Run Code Online (Sandbox Code Playgroud)

解决方案

UPDATE dbo.Test
SET Required_result =
    ISNULL
    (
        (
            SELECT 
                -- Reassemble parts with no matches
                result = STRING_AGG(LTRIM(SS.[value]), ', ')
            FROM dbo.Test AS T2
            CROSS APPLY STRING_SPLIT
            (
                -- Remove commas before splitting
                REPLACE(T2.Col2, ',', ''),
                -- Split on spaces
                SPACE(1)
            ) AS SS
            WHERE
                -- For the current outer ID
                T2.ID = dbo.Test.ID
                -- Current part has no match
                AND 0 = 
                    CHARINDEX
                    (
                        SPACE(1) + LTRIM(SS.[value]) + SPACE(1), 
                        SPACE(1) + T2.Col1 + SPACE(1)
                    )
        ),
        -- Empty string instead of NULL if everything matched
        SPACE(0)
    );
Run Code Online (Sandbox Code Playgroud)

结果

ID 第 1 列 第2栏 必需的结果
1 铅笔红 木炭、铅笔、秤 木炭、秤
2 铅笔红 木炭,红色,规模 木炭、秤
3 圆珠笔 擦掉,漂亮 橡皮
4 圆珠笔 球、盒子 盒子
5 圆珠笔 橡皮、圆珠笔 橡皮
6 圆珠笔 橡皮、笔珠 橡皮
7 圆珠笔 橡皮、水罐、袋子 橡皮、水罐、袋子
8 笔记本 笔记本
9 笔记本 记事本、橡皮擦 橡皮
10 笔记本

数据库<>小提琴


如果需要保证保留 Col2 字符串组件的顺序,请在可选的enable_ordinal参数(需要 Azure SQL 数据库或 SQL Server 2022)中传递值 1STRING_SPLIT并添加WITHIN GROUP (ORDER BY SS.ordinal)STRING_AGG聚合:

UPDATE dbo.Test
SET Required_result =
    ISNULL
    (
        (
            SELECT 
                -- Reassemble parts with no matches
                result = STRING_AGG(LTRIM(SS.[value]), ', ')
                    WITHIN GROUP (ORDER BY SS.ordinal)
            FROM dbo.Test AS T2
            CROSS APPLY STRING_SPLIT
            (
                -- Remove commas before splitting
                REPLACE(T2.Col2, ',', ''),
                -- Split on spaces
                SPACE(1),
                -- Enable ordinal
                1
            ) AS SS
            WHERE
                -- For the current outer ID
                T2.ID = dbo.Test.ID
                -- Current part has no match
                AND 0 = 
                    CHARINDEX
                    (
                        SPACE(1) + LTRIM(SS.[value]) + SPACE(1), 
                        SPACE(1) + T2.Col1 + SPACE(1)
                    )
        ),
        -- Empty string instead of NULL if everything matched
        SPACE(0)
    );
Run Code Online (Sandbox Code Playgroud)