[英]SQL Server : extract domain and params from 1 million rows into temp table
我在一列中有一百萬行或Urls。 列名是[url]
,表名是重定向。
我正在運行SQL Server 2014。
我需要一種將每個URL的子域提取到臨時表中的新列中的方法。
理想情況下,在同一類型中,將查詢字符串的不同參數名稱選擇到另一列中,並將參數值選擇到另一列中
我主要關心的是性能在遍歷一百萬行時不會鎖定服務器。
如果更有意義,我將很樂意運行3個查詢來獲取結果
列數據的示例:
https://www.google.com/ads/ga-audiences?v=1&aip=1&t=sr&_r=4&tid=UA-9999999-1&cid=9999107657.199999834&jid=472999996&_v=j66&z=1963999907
https://track.kspring.com/livin-like-a-star#pid=370&cid=6546&sid=front
所以我最終在臨時表中有3列
URL | Param | Qstring
------------------+-------+----------
www.google.com | v | 1
www.google.com | aip | 1
www.google.com | t | dc
www.google.com | tid | UA-1666666-1
www.google.com | jid | 472999996
track.kspring.com | pid | 370
track.kspring.com | cid | 6546
track.kspring.com | sid | front
我一直在看一些示例來從字符串中提取域名,但是我對正則表達式或字符串操作沒有太多經驗。
.Net CLR功能擅長於這種處理。 只需使用Uri
並從CLR表值函數中進行解析(這樣您就可以在一個調用中輸出多個列)。
獲取NGrams8K的副本,您可以執行以下操作:
-- sample data
declare @table table ([url] varchar(8000));
insert @table values
('https://www.google.com/ads/ga-audiences?v=1&aip=1&t=sr&_r=4&tid=UA-9999999-1&cid=9999107657.199999834&jid=472999996&_v=j66&z=1963999907'),
('https://track.kspring.com/livin-like-a-star#pid=370&cid=6546&sid=front');
declare @delimiter varchar(20) = '%[#?;]%'; -- customizable parameter for parsing parameter values
-- solution
select
[url] = substring([url], a1.startPos, a2.aLen-a1.startPos),
[param] = substring(item, 1, charindex('=', split.item)-1),
qString = substring(item, charindex('=', split.item)+1, 8000)
from @table t
cross apply (values (charindex('//',[url])+2)) a1(startPos)
cross apply (values (charindex('/',[url],a1.startPos))) a2(aLen)
cross apply
(
select split.item
from (values (len(substring([url], a2.aLen,8000)), 1)) as l(s,d)
cross apply
( select -(l.d) union all
select ng.position
from dbo.NGrams8k(substring([url], a2.aLen,8000), l.d) as ng
where token LIKE @delimiter
) as d(p)
cross apply (values(replace(substring(substring([url], a2.aLen,8000), d.p+l.d,
isnull(nullif(patindex('%'+@delimiter+'%',
substring(substring([url], a2.aLen,8000), d.p+l.d, l.s)),0)-1, l.s+l.d)),
'&',''))) split(item)
where split.item like '%=%'
) split(item);
結果
url param qString
------------------- ------- ---------------------------------
www.google.com v 1
www.google.com aip 1
www.google.com t sr
www.google.com _r 4
www.google.com tid UA-9999999-1
www.google.com cid 9999107657.199999834
www.google.com jid 472999996
www.google.com _v j66
www.google.com z 1963999907
track.kspring.com pid 370
track.kspring.com cid 6546
track.kspring.com sid front
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.