カンマ区切りのデータをカンマで分割して、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として分割)よりも、後者の方が、処理時間が早そう。