我有这样的数据:
**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而不仅仅是域名。
如果您也可以帮助解决此异常的代码,那将非常有用。
感谢。
答案 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