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

Phân tích cú pháp chuỗi được phân tách bằng dấu phẩy để tạo IN Danh sách các chuỗi trong mệnh đề Where

Tạo chức năng này (sqlserver 2005+)

CREATE function [dbo].[f_split]
(
@param nvarchar(max), 
@delimiter char(1)
)
returns @t table (val nvarchar(max), seq int)
as
begin
set @param += @delimiter

;with a as
(
select cast(1 as bigint) f, charindex(@delimiter, @param) t, 1 seq
union all
select t + 1, charindex(@delimiter, @param, t + 1), seq + 1
from a
where charindex(@delimiter, @param, t + 1) > 0
)
insert @t
select substring(@param, f, t - f), seq from a
option (maxrecursion 0)
return
end

sử dụng câu lệnh này

SELECT *
FROM yourtable 
WHERE account in (SELECT val FROM dbo.f_split(@account, ','))

So sánh hàm phân tách của tôi với phân tách XML:

Dữ liệu kiểm tra:

select top 100000 cast(a.number as varchar(10))+','+a.type +','+ cast(a.status as varchar(9))+','+cast(b.number as varchar(10))+','+b.type +','+ cast(b.status as varchar(9)) txt into a 
from master..spt_values a cross join master..spt_values b

XML:

 SELECT count(t.c.value('.', 'VARCHAR(20)'))
 FROM (
     SELECT top 100000 x = CAST('<t>' + 
           REPLACE(txt, ',', '</t><t>') + '</t>' AS XML)
           from a
 ) a
 CROSS APPLY x.nodes('/t') t(c)

Elapsed time: 1:21 seconds

f_split:

select count(*) from a cross apply clausens_base.dbo.f_split(a.txt, ',')

Elapsed time: 43 seconds

Điều này sẽ thay đổi theo từng giai đoạn, nhưng bạn có thể hiểu được



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VỚI CHECK ADD CONSTRAINT, sau đó là CHECK CONSTRAINT so với ADD CONSTRAINT

  2. Cách chọn JSON lồng nhau trong SQL Server với OPENJSON

  3. Sự khác biệt giữa sys.objects, sys.system_objects và sys.all_objects trong SQL Server

  4. Sao lưu cấp bảng

  5. Bỏ tất cả các bảng có tên bắt đầu bằng một chuỗi nhất định