首页 > 解决方案 > 更新 SQL Server 中分隔符之间包含的字符串的一部分

问题描述

我必须更新一个文本列,它是一个由|. 我想用空文本替换第二个字符串。

列值示例:

TD_DM_U100|BK_U100|TL_DM_U100||||
TD_DM_U200|BK_U200|TL_DM_L100||SOME TEXT||
TD_DM_U300|BK_U300|TL_DM_L100||SOME TEXT|MORE TEXT|

更新后的结果(去掉第二个字符串)

TD_DM_U100||TL_DM_U100||||
TD_DM_U200||TL_DM_L100||SOME TEXT||
TD_DM_U300||TL_DM_L100||SOME TEXT|MORE TEXT|

标签: sqlsql-serversql-updatesql-server-2016

解决方案


小提琴

SET NOCOUNT ON;
GO

DECLARE
    @val VARCHAR(MAX);

DECLARE
    @TestData TABLE
    (
        Id INT IDENTITY (1, 1),
        Col1 VARCHAR(100)
    );

DECLARE
    @i INT = 1;

INSERT INTO @TestData
VALUES
(
    'TD_DM_U100|BK_U100|TL_DM_U100||||'
),
(
    'TD_DM_U200|BK_U200|TL_DM_L100||SOME TEXT||'
),
(
    'TD_DM_U300|BK_U300|TL_DM_L100||SOME TEXT|MORE TEXT|'
);

DECLARE
    @Result TABLE
    (
        Col1 VARCHAR(100)
    );

WHILE @i <=
    (
        SELECT
            COUNT(*)
        FROM
            @TestData
    )
BEGIN

    SET @val = NULL;

    SELECT
        @val = COALESCE(@val + '| ' + v.Col1, v.Col1)
    FROM
        (
            SELECT
                ROW_NUMBER() OVER (ORDER BY
                (
                    SELECT
                        1
                )
                ) rn,
                value
            FROM
                STRING_SPLIT(
                (
                    SELECT
                        Col1
                    FROM
                        @TestData
                    WHERE
                        Id = @i
                )
                , '|')
        ) t1
        CROSS APPLY
            (
                SELECT
                    CASE
                        WHEN rn = 2 THEN ''
                        ELSE value
                    END
            ) v (Col1);


    INSERT INTO @Result
    SELECT
        @val;

    SET @i += 1;

END;

SELECT
    *
FROM
    @Result;


推荐阅读