簡體   English   中英

SQL Server:從一百萬行中提取域和參數到臨時表中

[英]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)),
         '&amp',''))) 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM