Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tách các từ theo nhóm khôn ngoan cho mỗi hàng trong SQL

Chà, bạn nên thiết kế lại bảng của mình. Dù sao, đây là nỗ lực của tôi khi sử dụng DelimitedSplit8k của Jeff Moden .

Tôi tin rằng bạn hiện có chức năng này vì tôi đã trả lời một trong các câu hỏi trước đây của bạn cũng sử dụng chức năng này.

Trước tiên, bạn muốn tách @string của mình nhập vào các hàng riêng biệt. Bạn cũng nên tách Group_Words bảng.

Sau đó, bạn thực hiện LEFT JOIN để có được các danh mục phù hợp. Sau đó, bạn loại bỏ các từ không hợp lệ.

Xem nó hoạt động tại đây: 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, '')

ĐẦU RA :

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

Nếu @string của bạn đầu vào có nhiều hơn 8000 ký tự, DelimitedSplit8K sẽ chậm lại. Bạn có thể sử dụng các bộ chia khác để thay thế. Đây là một thông tin được lấy cho bài viết của Sir Aaron Bertrands .

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. Làm cách nào để kết nối với cơ sở dữ liệu SQL Server trong CodeIgniter?

  2. Nhận tất cả các điểm (hình tròn có bán kính), điểm đó trùng với điểm đã cho

  3. Sử dụng dạng xem SQL từ mã khung thực thể Phiên bản đầu tiên 5

  4. T-SQL:Chọn cột dựa trên MAX (Cột khác)

  5. Cập nhật tất cả trừ một bản ghi trùng lặp trong bảng trong SQL Server