Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Oddziel słowa według grup dla każdego wiersza w SQL

Wow, powinieneś przeprojektować swoje stoły. W każdym razie, oto moja próba użycia DelimitedSplit8k Jeffa Modena .

Wierzę, że masz teraz tę funkcję, ponieważ odpowiedziałem na jedno z Twoich poprzednich pytań który również korzysta z tej funkcji.

Najpierw chcesz podzielić swój @string dane wejściowe w osobnych wierszach. Powinieneś także podzielić Group_Words tabela.

Następnie wykonujesz LEFT JOIN aby uzyskać pasujące kategorie. Następnie eliminujesz nieprawidłowe słowa.

Zobacz to w akcji tutaj: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, '')

WYJŚCIE :

|                                                                                                  |
|--------------------------------------------------------------------------------------------------|
| No People,Day,side view,looking at camera,snow,mountain,tranquil scene,tranquility,walking,water |

Jeśli Twój @string wejście ma więcej niż 8000 znaków, DelimitedSplit8K zwolni. Zamiast tego możesz użyć innych rozdzielaczy. Oto jeden do artykułu sir Aarona Bertrandasa . .

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. Zmień separator na przecinek podczas wysyłania wyników zapytania pocztą e-mail w programie SQL Server (T-SQL)

  2. Utwórz kolumnę „Ostatnia modyfikacja” w SQL Server

  3. Ograniczenie klucza obcego może powodować cykle lub wiele ścieżek kaskadowych?

  4. Jak czytać kolumnę XML w SQL Server 2008?

  5. Jak działa funkcja konwersji SQL podczas konwertowania daty i godziny na zmiennoprzecinkową?