Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Разделете думите по групи за всеки ред в SQL

Уау, трябва да промените дизайна на вашите маси. Както и да е, ето моя опит да използвам 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 



  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 Server

  2. Как програмно да задам низа за връзка за Entity-Framework Code-First?

  3. Причини за надстройка до SQL Server 2017

  4. Защо RAND() не произвежда произволни числа?

  5. Как мога да създам уникално ограничение за моята колона (SQL Server 2008 R2)?