sql >> Databáze >  >> RDS >> Sqlserver

Analyzujte řetězec oddělený čárkami a vytvořte IN Seznam řetězců v klauzuli Where

Vytvořte tuto funkci (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

použijte toto prohlášení

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

Porovnání mé funkce rozdělení s rozdělením XML:

Testovací data:

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

Toto se bude měnit běh od běhu, ale vy máte nápad



  1. GET_FORMAT() Příklady – MySQL

  2. Skupiny dostupnosti SQL Server AlwaysOn:Instalace a konfigurace, část 2

  3. Co je STATISTICKÝ PROFIL na serveru SQL Server?

  4. Jak nastavit národní prostředí pro aktuální připojení v MySQL