2011-08-02 2 views
0

C#에서 정규식을 사용하지 않고 SQLCLR을 사용하면 5 억 개의 행이있는 테이블에서 URL의 "줄기"를 가져 오는 가장 좋은 방법은 무엇입니까? 열은 (3000)는 VARCHAR 테이블은 다음과 같이 행이 :SQL Server URL 시작 TSQL 전용?

http://a.com    1 
http://b.au    1 
http://c.edu    1  
http://d.com    3 

감사 :

http://a.com 
http://b.au 
http://c.edu?a=3 
http://d.com/?a=3 
http://d.com/?a=3&b=2 
http://d.com/?a=3&b=2 

나는 테이블에서 선택하고이 결과 집합을 얻을 필요가있다.

답변

2

어떨까요;

;with test (url) as (
    select 'http://a.com' union 
    select 'http://b.au' union 
    select 'http://c.edu?a=3' union 
    select 'http://d.com/?a=3' union 
    select 'http://d.com/?a=3&b=2' union all 
    select 'http://d.com/?a=3&b=2' 
) 
select 
    rtrim(replace(left(url, charindex('?', url + '?', 1) - 1) + ' ', '/ ', '')) 
from test 


>>> 
http://a.com 
http://b.au 
http://c.edu 
http://d.com 
http://d.com 

변경 그룹에 대한

...,COUNT(*) 
from test 
    group by rtrim(replace(left(url, charindex('?', url + '?', 1) - 1) + ' ', '/ ', '')) 

합니다.

+0

순수한 T-SQL에서이를 수행하려면이 방법이 필요합니다. 그러나 원하는 최종 상태에 따라 응용 프로그램 또는 프리젠 테이션 레이어에서 문자열 서식을 수행하는 것이 좋습니다. 문자열 형식은 단순히 SQL의 장점 중 하나가 아닙니다. – TimothyAWiseman

3

"줄기"가 모두 '?'로 끝나면 또는 '/?'를 사용하면 이것을 사용할 수 있습니다. 추가 절단 패턴은 필요한 경우 CASE 문에 추가 할 수 있습니다.

DECLARE @test TABLE (URL varchar(3000)) 

INSERT INTO @test (URL) VALUES ('http://a.com') 
INSERT INTO @test (URL) VALUES ('http://b.au') 
INSERT INTO @test (URL) VALUES ('http://c.edu?a=3') 
INSERT INTO @test (URL) VALUES ('http://d.com/?a=3') 
INSERT INTO @test (URL) VALUES ('http://d.com/?a=3&b=2') 
INSERT INTO @test (URL) VALUES ('http://d.com/?a=3&b=2') 

SELECT SUBSTRING(URL, 0, 
    CASE 
     WHEN PATINDEX('%/?%', URL) > 0 THEN PATINDEX('%/?%', URL) 
     WHEN PATINDEX('%?%', URL) > 0 THEN PATINDEX('%?%', URL) 
     ELSE LEN(URL) + 1 
    END), COUNT(*) 
FROM @test 
GROUP BY SUBSTRING(URL, 0, 
    CASE 
     WHEN PATINDEX('%/?%', URL) > 0 THEN PATINDEX('%/?%', URL) 
     WHEN PATINDEX('%?%', URL) > 0 THEN PATINDEX('%?%', URL) 
     ELSE LEN(URL) + 1 
    END)