从URL中提取域

时间:2013-10-29 16:49:10

标签: sql tsql

我有这样的数据:

**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参数的长度(我知道我想要的长度是第三个'/'MINUS位置的第二个'/' ):

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

已添加奖励:对于特定情况(google.com/imghp),我希望域列显示google.com/imghp而不仅仅是域名。

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

感谢。

3 个答案:

答案 0 :(得分:0)

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

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

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

真正让我担心的是,可能有很多网址格式会破坏您获取您未考虑的域名的规则。怎么样:

www.SomeDepartment.SomeCompany.com

www.SomeCompany.com.CountryCode

www2.SomeCompany.com

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

答案 1 :(得分: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;

答案 2 :(得分: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