Shi*_*iva 0 sql-server string-manipulation
我有一个场景,如果部分单词与另一列匹配,则从一组逗号分隔的字符串中替换整个字符串。
我发现用文字解释非常复杂,因此我通过包含各种示例的屏幕截图进行了解释。
请帮助我使用存储过程或函数或查询来获取所需结果列中的结果,如下面的屏幕截图所示。
我尝试使用STRING_SPLIT
函数来分割值并连接表。我对解决这个问题的逻辑感到震惊。
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)