Удалить строку из непоследовательной строки значений, разделенных запятыми - PullRequest
0 голосов
/ 28 октября 2019

SQL Server 2017 в Azure.

Учитывая поле с именем Categories в таблице с именем dbo.sources:

ID   Categories
1    ABC01, FFG02, ERERE, CC201
2    GDF01, ABC01, GREER, DS223
3    DSF12, GREER
4    ABC01
5    NULL

Каков синтаксис для запроса, который удалит ABC01 из любой записи, где она существует, но сохранить другие коды в строке?

Результаты будут такими:

ID   Categories
1    AFFG02, ERERE, CC201
2    GDF01, GREER, DS223
3    DSF12, GREER
4    NULL
5    NULL

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Нормализуя и затем денормализуя ваши данные, вы можете сделать это:

USE Sandbox;
GO

CREATE TABLE dbo.Sources (ID int,
                          Categories varchar(MAX));
INSERT INTO dbo.Sources
VALUES (1,'ABC01,FFG02,ERERE,CC201'), --I **assume you don't really have the space)
       (2,'GDF01,ABC01,GREER,DS223'),
       (3,'DSF12,GREER'),
       (4,'ABC01'),
       (5,NULL);
GO

DECLARE @Source varchar(5) = 'ABC01'; --Value to remove

WITH CTE AS(
    SELECT S.ID,
           STRING_AGG(NULLIF(SS.[value],@Source),',') WITHIN GROUP(ORDER BY S.ID) AS Categories
    FROM dbo.Sources S
         CROSS APPLY STRING_SPLIT(S.Categories,',') SS
    GROUP BY S.ID)
UPDATE S
SET Categories = C.Categories
FROM dbo.Sources S
     JOIN CTE C ON S.ID = C.ID;
GO
SELECT ID,
       Categories
FROM dbo.Sources

GO

DROP TABLE dbo.Sources;

Хотя это выглядит немного излишним, по сравнению с REPLACE, оно показывает, почему нормализация это гораздо лучшая идея вво-первых, и как это просто на самом деле.

1 голос
/ 28 октября 2019

Вы можете использовать Заменить следующим образом:

update dbo.sources set
    category = replace(replace(category,'ABC01',''),', ','')
where category like '%ABC01%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...