SQL Server - 从较长的字符串中删除字符串,其中要删除的值位于记录到记录的不同位置

Stp*_*111 -1 t-sql sql-server

SQL Server 2016.

我有一个看起来像这样的表:

ID  Categories
1   XMDO1, EFA02, EFA04, EMDO1, XMDO2
2   EFR02, LFA02, UFA04, RMED1, XMDO1, XMDO2
3   ELR02, GFF02, XFA04, VMED1, XMDO1
Run Code Online (Sandbox Code Playgroud)

...以及2,000个类似记录,其中任何代码都可以按字符串中的任何顺序出现.

如何构造一个查询以从所有上述记录中删除XMDO1,以便生成的表看起来像这样?

ID  Categories
1   EFA02, EFA04, EMDO1, XMDO2
2   EFR02, LFA02, UFA04, RMED1, XMDO2
3   ELR02, GFF02, XFA04, VMED1
Run Code Online (Sandbox Code Playgroud)

Dai*_*Dai 5

我正在猜测:

-- First pass (cases where XMD01 is not the first item):

UPDATE
    tableName
SET
    Categories = REPLACE( Categories, ', XMD01', '' )

-- Second pass (cases where XMD01 is the first or only item):

UPDATE
    tableName
SET
    Categories = REPLACE( Categories, 'XMD01', '' )
Run Code Online (Sandbox Code Playgroud)

这些可以组合:

UPDATE
    tableName
SET
    Categories =
        REPLACE( REPLACE( Categories, ', XMD01', '' ), 'XMD01', '' )
Run Code Online (Sandbox Code Playgroud)

如果你想要一个准确的行数和可能稍快的性能,那么添加一个WHERE这样的子句(并重新格式化以便于阅读):

UPDATE
    tableName
SET
    Categories =
        REPLACE(
            REPLACE(
                Categories,
                ', XMD01', -- Cases where XMD01 is not the first item.
                ''
            ),
            'XMD01', -- Cases where XMD01 is the first or only item.
            ''
        )
WHERE
    CHARINDEX( 'XMD01', Categories ) > 0
Run Code Online (Sandbox Code Playgroud)