0

我有这样的数据:

**User  URL**
1   http://www.groupon.com/
1   http://www.groupon.com/
1   http://www.groupon.com/
2   http://www.wikihow.com/Main-Page
2   http://www.wikihow.com/Main-Page
3   http://www.google.com/imghp
3   http://www.google.com/imghp

我想将他们的域提取到另一列中,如下所示:

**User  URL                             Domain**
1   http://www.groupon.com/             groupon.com
1   http://www.groupon.com/today        groupon.com
1   http://www.groupon.com/deals        groupon.com
2   http://www.wikihow.com/Main-Page    wikihow.com
2   http://www.wikihow.com/Main-Page    wikihow.com
3   http://www.google.com/imghp         google.com/imghp
3   http://www.google.com/flights           google.com 

不知道作为初学者如何做到这一点。我的直觉是我需要提取'://'和下一个'/'之间的所有内容。

我想我想这样开始,但不确定如何获取第三个 SUBSTR 参数的长度(我知道我想要的长度是第三个'/'的位置减去第二个'/'的位置):

SUBSTR(URL, INDEX(URL, "://)+7, ???)

额外的好处:对于一个非常具体的案例(google.com/imghp),我希望域列显示 google.com/imghp 而不仅仅是域。

如果您也可以帮助处理此异常的代码,那将非常有帮助。

谢谢。

4

3 回答 3

0

您可以使用嵌套的 CHARINDEX 获取 SUBSTR 的第三个参数。CHARINDEX 有一个可选的第三个参数,可让您指定开始搜索的起始位置。这将是一个长而丑陋的查询,但它会得到你正在寻找的字符串。

SUBSTR(URL, CHARINDEX(URL, [StartingPoint]), (CHARINDEX(URL, [EndingPoint], (CHARINDEX(URL, [StartingPoint])))-CHARINDEX(URL, [StartingPoint])))

至于“特殊情况”,您可以在 CASE 语句中使用 LIKE '%google.com/imghp%' 来处理。

我真正担心的是,可能有很多 URL 格式会破坏您获取您没有考虑的域的规则。关于什么:

www.SomeDepartment.SomeCompany.com

www.SomeCompany.com.CountryCode

www2.SomeCompany.com

您是否看过一些包含 5 个以上元素的 .edu URL?我会向这些信息的消费者询问有关任何可能的 URL 格式的“域”究竟由什么构成的明确业务规则。

于 2013-10-29T17:41:06.140 回答
0

我创建了您的测试用例和一些我在开发答案时想到的额外内容:-

set nocount on
go
create table #log (
    url varchar(50)
)
go
insert into #log values('http://www.groupon.com/')
insert into #log values('http://www.groupon.com/today')
insert into #log values('https://groupon.com/deals')
insert into #log values('http://www.wikihow.com/Main-Page')
insert into #log values('http://www.wikihow.com/Main-Page')
insert into #log values('https://www.google.com/imghp')
insert into #log values('http://google.com/flights')
insert into #log values('http://www.amazon.com/cameras')
insert into #log values('https://www.amazon.co.uk/cameras')
go

然后创建了这个函数:-

create function dbo.GetDomain(@url varchar(1024)) 
returns varchar(1024) as begin
    declare @returnValue varchar(1024)
    declare @position int
    declare @pattern varchar(50)
    if CHARINDEX('google.com/imghp',@url)>0 --if it's your special case
        set @returnValue='google.com/imghp'
    else begin
        set @url=replace(@url,'http://','') --strip off typical prefixes
        set @url=replace(@url,'https://','')
        set @position=CHARINDEX('/',@url) --check if there is a slash
        if @position>0
            set @url=left(@url,@position-1) --and strip it and everything after it off
        select @pattern=case
            when PATINDEX('%.co.uk',@url)>0 then '%.%.%.%' --repeat this line for any other exceptions
            else '%.%.%'
        end
        while PATINDEX(@pattern,@url)>0 begin --now check if our pattern matches
            set @url=SUBSTRING(@url,CHARINDEX('.',@url)+1,1024) --and strip off the prefix if it does
        end
        set @returnValue=@url
    end
    return @ReturnValue
end
go

调用时:-

select *, dbo.GetDomain(url) as domain
from #log
go

产生:-

url                               domain
http://www.groupon.com/           groupon.com
http://www.groupon.com/today      groupon.com
https://groupon.com/deals         groupon.com
http://www.wikihow.com/Main-Page  wikihow.com
http://www.wikihow.com/Main-Page  wikihow.com
https://www.google.com/imghp      google.com/imghp
http://google.com/flights         google.com
http://www.amazon.com/cameras     amazon.com
https://www.amazon.co.uk/cameras  amazon.co.uk
于 2013-10-30T01:20:33.707 回答
0

这可能不是最好的答案,但它可以解决问题。你可以改进我的代码。请参阅我创建的SQL Fiddle 。希望有意义

CREATE TABLE myurls 
    (
     user int, 
     url varchar(40), 
     domain varchar(40)
    );

INSERT INTO myurls
(user, url)
VALUES
('1', 'http://www.groupon.com'),
('1', 'http://www.groupon.com'),
('2', 'http://www.wikihow.com/Main-Page'),
('2', 'http://www.wikihow.com/Main-Page');


SELECT user, url, SUBSTRING(url, 11, 100) AS domains
FROM myurls;
于 2013-10-29T18:35:02.930 回答