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

Cách tìm sự khác biệt giữa hai chuỗi trong SQL

Cả hai chuỗi phải được chia thành các phần của chúng. Trong SQL-Server 2008, điều này tốt nhất nên được thực hiện bằng cách tiếp cận XML.

chú ý :Nếu dữ liệu của bạn có thể bao gồm các ký tự bị cấm như <>öä@€& và không chỉ là các ký tự latin đơn thuần như trong ví dụ của bạn, bạn sẽ cần thêm một số nỗ lực ...

Phần còn lại khá dễ dàng:Chỉ cần lấy tất cả các phần của @String1 không tìm thấy trong @String2 .

Kết quả nối - một lần nữa - tốt nhất nên được thực hiện qua XML

Hãy thử điều này:

Declare @String1 as varchar(100)='a,b,c,d,e';

Declare @String2 as varchar(100)='b,e';

WITH FirstStringSplit(S1) AS
(
    SELECT CAST('<x>' + REPLACE(@String1,',','</x><x>') + '</x>' AS XML)
)
,SecondStringSplit(S2) AS
(
    SELECT CAST('<x>' + REPLACE(@String2,',','</x><x>') + '</x>' AS XML)
)

SELECT STUFF(
(
    SELECT ',' + part1.value('.','nvarchar(max)')
    FROM FirstStringSplit
    CROSS APPLY S1.nodes('/x') AS A(part1)
    WHERE part1.value('.','nvarchar(max)') NOT IN(SELECT B.part2.value('.','nvarchar(max)')
                                                  FROM SecondStringSplit 
                                                  CROSS APPLY S2.nodes('/x') AS B(part2)
                                                  ) 
    FOR XML PATH('')

),1,1,'')


  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 Làm thế nào để đặt chính xác giá trị biến ngày và sử dụng nó?

  2. chuỗi tổng hợp tsql cho nhóm theo

  3. Kết hợp giá trị trường thành chuỗi trong SQL Server

  4. Chọn bộ xử lý cho SQL Server 2014 - Phần 2

  5. CTE đệ quy với bộ bảo mật duy nhất phải có giá trị trong một mỏ neo