Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL में प्रत्येक पंक्ति के लिए समूह के अनुसार शब्दों को अलग करें

वाह, आपको अपनी टेबल को फिर से डिजाइन करना चाहिए। वैसे भी, यहाँ जेफ मोडेन के 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर संग्रहीत कार्यविधि में नाम के बजाय अनुक्रमणिका द्वारा तालिका के स्तंभों तक पहुँचें

  2. एसक्यूएल 'पसंद' क्वेरी '%' का उपयोग कर जहां खोज मानदंड में '%' शामिल है

  3. BIDS SSRS में पोजिशनिंग टेबल और चार्ट

  4. 30 दिनों से डेटा कैसे चुनें?

  5. ASP.NET MVC 5 एप्लिकेशन के लिए समय क्षेत्र कैसे सेट करें?