Уау, трябва да промените дизайна на вашите маси. Както и да е, ето моя опит да използвам DelimitedSplit8k на Jeff Moden .
Вярвам, че вече имате тази функция, тъй като отговорих на един от вашите предишни въпроси който също използва тази функция.
Първо, искате да разделите своя @string
въвеждане в отделни редове. Трябва също така да разделите Group_Words
таблица.
След това правите LEFT JOIN
за да получите съответстващите категории. След това премахвате невалидните думи.
Вижте го в действие тук:SQL Fiddle
DECLARE @string VARCHAR(8000)SET @string ='Без хора,Ден,страничен изглед,гледане в камерата,сняг,планина,спокойна сцена,спокойствие,Нощ,разходка,вода,Двама души,глед надолу '-- Разделете @string променливаDECLARE @tbl_string AS TABLE(ItemNumber INT, Item VARCHAR(8000))INSERT INTO @tbl_stringSELECT ItemNumber, LTRIM(RTRIM(Item))FROM dbo.DelimitedSplit8K(@string, ',')-- Нормализиране на Group_WordsDECLARE @tbl_grouping AS TABLE(Категория VARCHAR(20), ItemNumber INT, Item VARCHAR(8000))INSERT INTO @tbl_groupingSELECT w.Category, s.ItemNumber, LTRIM(RTRIM(s.Item))FROM Group_Words wCROSS 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, '')
ИЗХОД :
<предварителен код>| ||------------------------------------------------ -------------------------------------------------- || Няма хора, ден, страничен изглед, гледане в камера, сняг, планина, спокойна сцена, спокойствие, ходене, вода |
Ако вашият @string
входът има повече от 8000
знаци, DelimitedSplit8K
ще се забави. Вместо това можете да използвате други сплитери. Ето един, взет за статията
на сър Арън Бертрандс .
CREATE FUNCTION dbo.SplitStrings_XML( @List NVARCHAR(MAX), @Delimiter NVARCHAR(255))ВРЪЩА ТАБЛИЦА СЪС СХЕМАОБВЪРЗВАНЕКАТО ВРЪЩАНЕ ( SELECT Item =y.i.value('(./text())[1]', 'nvarchar(4000)') FROM ( SELECT x =CONVERT(XML, '' + REPLACE(@List, @Delimiter, '') + '').query ('.') ) AS a CROSS APPLY x.nodes('i') AS y(i) );GO