2017-12-09 2 views
0

1つの列にわずか100万行以上のURLがあります。列名は[url]で、表名はリダイレクトです。SQL Server:ドメインとパラメータを100万行から一時テーブルに抽出します

私は、SQL Server 2014

を実行していますが、私は、一時テーブルの新しい列にURLごとにサブドメインを抽出する方法が必要です。

理想的には、同じタイプの別の列に別の列とのparam値にクエリ文字列に対して個別のparamの名前を選択し

私の主な関心事は、万行をループしながら、サーバーをロックではないパフォーマンスです。

私はそれが列データの

例として、より理にかなっている場合は、結果を得るために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 

私は文字列からドメイン名を抽出するいくつかの例を見てきましたが、正規表現や文字列操作に関する多くの経験はありません。

+0

を理由から "トラック" "www.google.com" から "WWW" を削除ではなく、 "" track.kspring.com "?最高のレベルとドメイン名だけがほしいと思う。 –

+0

Dan、あなたは正しい。この例をタイプするとき、私はサブドメインとして" www "を考えなかった。それは "www.google.com"と "track.kspring.com"である必要があります。これを指摘してくれてありがとう – jasonkkt

答えて

0

これは、.Net CLR機能が優れた処理の一種です。 Uriを使用し、CLR Table Value Functionから解析してください(1回の呼び出しで複数の列を出力できるように)。

0

グラブ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('%'[email protected]+'%', 
      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 
関連する問題