【SQL Server】文字列を分割してn番目を取得

Sponsored Links

カンマ区切りのデータをカンマで分割して、2番目を取得するときなどに使えるファンクション。
こちらのstackoverflowにほかの方法も記載されているので、ご参照を。
下記では、データをXml文字列へ変換し、その中からn番目を取得する方法、STRING_SPLITファンクションを使用して、n番目を取得する方法を考察した。

下記例では、「/」で結合されたデータの2番目のデータを取得するクエリ。
どちらの方法でも、/区切りの2番目の「bbb」を取得する。

declare @tbl table (
	id int,
	col1 nvarchar(100)
)

declare @start1 as datetime, @end1 as datetime, @start2 as datetime, @end2 as datetime;

insert into @tbl values	
(1, 'aaa/bbb/ccc'),
(2, 'aaa/bbb/ccc'),
(3, 'aaa/bbb/ccc'),
(4, 'aaa/bbb/ccc'),
(5, 'aaa/bbb/ccc'),
-------省略
(996, 'aaa/bbb/ccc'),
(997, 'aaa/bbb/ccc'),
(998, 'aaa/bbb/ccc'),
(999, 'aaa/bbb/ccc'),
(1000, 'aaa/bbb/ccc')

--方法1
set @start1 = getdate();
select	id, 
	CAST('<x>' + REPLACE(col1,'/','</x><x>') + '</x>' AS XML).value('/x[2]','nvarchar(max)')
from	@tbl
set @end1 = getdate();

--方法2
set @start2 = getdate();
select	id, 
	(SELECT VALUE FROM
		(
		SELECT VALUE , ROW_NUMBER() OVER (ORDER BY (SELECT null)) rnk FROM STRING_SPLIT(col1, '/')
		)x where rnk = 2)
from	@tbl
set @end2 = getdate();

select DATEDIFF(MILLISECOND, @start1, @end1) as first_method, DATEDIFF(MILLISECOND, @start2, @end2) as second_method;

最後のクエリで、各々方法を使用し、1,000件のデータを処理した際の時間を出力した。
結果は、最初の方法(Xmlとして分割)よりも、後者の方が、処理時間が早そう。

IT
Sponsored Links
Sponsored Links
Sponsored Links
ようさんチョットでぶ
Copied title and URL
Bitnami