वाह, आपको अपनी टेबल को फिर से डिजाइन करना चाहिए। वैसे भी, यहाँ जेफ मोडेन के DelimitedSplit8k का उपयोग करने का मेरा प्रयास है। .
मेरा मानना है कि अब आपके पास यह फ़ंक्शन है क्योंकि मैंने आपके पिछले प्रश्नों में से एक का उत्तर दिया है। वह भी इस फ़ंक्शन का उपयोग करता है।
सबसे पहले, आप अपने @string
. को विभाजित करना चाहते हैं अलग पंक्तियों में इनपुट। आपको Group_Words
. को भी विभाजित करना चाहिए टेबल।
उसके बाद आप एक LEFT JOIN
करें मिलान श्रेणियां प्राप्त करने के लिए। फिर आप अमान्य शब्दों को हटा दें।
इसे यहां क्रिया में देखें: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, '')
आउटपुट :
| |
|--------------------------------------------------------------------------------------------------|
| No People,Day,side view,looking at camera,snow,mountain,tranquil scene,tranquility,walking,water |
अगर आपका @string
इनपुट में 8000
से अधिक है अक्षर, DelimitedSplit8K
धीमा कर देगा। आप इसके बजाय अन्य स्प्लिटर्स का उपयोग कर सकते हैं। यहाँ सर आरोन बर्ट्रेंड्स के लेख
के लिए लिया गया है। ।
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