2017-12-09 10 views
0

한 행에 수 백만 개의 행 또는 URL이 있습니다. 열 이름은 [url]이고 테이블 이름은 리디렉션됩니다.SQL Server : 도메인 및 매개 변수를 1 백만 행에서 임시 테이블로 추출

내가 SQL 서버 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에서 구문 분석하여 (하나의 호출에서 둘 이상의 열을 출력 할 수 있도록).

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