Chà, bạn nên thiết kế lại bảng của mình. Dù sao, đây là nỗ lực của tôi khi sử dụng DelimitedSplit8k của Jeff Moden .
Tôi tin rằng bạn hiện có chức năng này vì tôi đã trả lời một trong các câu hỏi trước đây của bạn cũng sử dụng chức năng này.
Trước tiên, bạn muốn tách @string
của mình nhập vào các hàng riêng biệt. Bạn cũng nên tách Group_Words
bảng.
Sau đó, bạn thực hiện LEFT JOIN
để có được các danh mục phù hợp. Sau đó, bạn loại bỏ các từ không hợp lệ.
Xem nó hoạt động tại đây: SQL Fiddle
DECLARE @string VARCHAR(8000)
SET @string = 'No People,Day,side view,looking at camera,snow,mountain,tranquil scene,tranquility,Night,walking,water,Two Person,looking Down'
-- Split @string variable
DECLARE @tbl_string AS TABLE(ItemNumber INT, Item VARCHAR(8000))
INSERT INTO @tbl_string
SELECT
ItemNumber, LTRIM(RTRIM(Item))
FROM dbo.DelimitedSplit8K(@string, ',')
-- Normalize Group_Words
DECLARE @tbl_grouping AS TABLE(Category VARCHAR(20), ItemNumber INT, Item VARCHAR(8000))
INSERT INTO @tbl_grouping
SELECT
w.Category, s.ItemNumber, LTRIM(RTRIM(s.Item))
FROM Group_Words w
CROSS APPLY dbo.DelimitedSplit8K(w.[Group], ',')s
;WITH Cte AS(
SELECT
s.ItemNumber,
s.Item,
g.category,
RN = ROW_NUMBER() OVER(PARTITION BY g.Category ORDER BY s.ItemNumber)
FROM @tbl_string s
LEFT JOIN @tbl_grouping g
ON g.Item = s.Item
)
SELECT STUFF((
SELECT ',' + Item
FROM Cte
WHERE
RN = 1
OR Category IS NULL
ORDER BY ItemNumber
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),
1, 1, '')
ĐẦU RA :
| |
|--------------------------------------------------------------------------------------------------|
| No People,Day,side view,looking at camera,snow,mountain,tranquil scene,tranquility,walking,water |
Nếu @string
của bạn đầu vào có nhiều hơn 8000
ký tự, DelimitedSplit8K
sẽ chậm lại. Bạn có thể sử dụng các bộ chia khác để thay thế. Đây là một thông tin được lấy cho bài viết
của Sir Aaron Bertrands .
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO