SQL Server Получить URL-адрес, начиная только с TSQL? - PullRequest
0 голосов
/ 02 августа 2011

Не требуя, чтобы SQLCLR использовал Regex в C #, каков наилучший способ получить только "ствол" URL-адреса из таблицы с 500 миллионами строк?Это столбец VarChar (3000), и в таблице есть такие строки:

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

Мне нужно выбрать из таблицы и получить такой набор результатов:

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Если все ваши URL "связаны", все заканчиваются на "?" или '/?', вы можете использовать это. Дополнительные шаблоны отсечения могут быть добавлены в операторы 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)
2 голосов
/ 02 августа 2011

Как насчет;

;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) + ' ', '/ ', ''))

для группы.

...