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

Przetwarzaj ciąg znaków oddzielonych przecinkami, aby utworzyć IN Lista ciągów w klauzuli Where

Utwórz tę funkcję (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

użyj tego oświadczenia

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

Porównując moją funkcję split do podziału XML:

Dane testowe:

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

To się zmieni z biegu na bieg, ale masz pomysł



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizowanie danych Salesforce za pomocą kursora SQL Server

  2. Porównaj DATETIME i DATE ignorując część czasu

  3. Jak utworzyć unikatowe ograniczenie, które również dopuszcza wartości null?

  4. Jak sprawdzić, czy baza danych istnieje w SQL Server?

  5. WYBIERZ DO AKTUALIZACJI z SQL Server