从URL中提取主机名

时间:2012-11-07 09:16:56

标签: sql sql-server

我必须在sql

中将网站名称修改为“.com”或“co.in”

示例:假设我的站点地址为“http://stackoverflow.com/questions/ask?title=trim”。 我需要将结果作为“stackoverflow.com”。

某些情况可能就像“www.google.co.in”那么我需要它是“google.co.in”

8 个答案:

答案 0 :(得分:10)

请使用以下SQL代码提取域名:

DECLARE @WebUrl VARCHAR(35);
SET @WebUrl = 'http://stackoverflow.com/questions/ask?title=trim'

SELECT @WebUrl AS 'WebsiteURL',
       LEFT(SUBSTRING(@WebUrl, 
       (CASE WHEN CHARINDEX('//',@WebUrl)=0 
            THEN 5 
            ELSE  CHARINDEX('//',@WebUrl) + 2
            END), 35),
       (CASE 
       WHEN CHARINDEX('/', SUBSTRING(@WebUrl, CHARINDEX('//', @WebUrl) + 2, 35))=0 
       THEN LEN(@WebUrl) 
       else CHARINDEX('/', SUBSTRING(@WebUrl, CHARINDEX('//', @WebUrl) + 2, 35))- 1
       END)
       ) AS 'Domain';

答案 1 :(得分:3)

我发现这里可能存在很多变化,特别是在针对引荐者表运行时。出于这个原因,我创建了一个SQL script that gets the host name from a web address,它也涵盖了我发现的所有边缘情况。

DECLARE @WebAddress varchar(300) = 'https://www.stevefenton.co.uk/2015/09/select-the-host-name-from-a-string-in-sql/'
SELECT 
    /* Get just the host name from a URL */
    SUBSTRING(@WebAddress,
        /* Starting Position (After any '//') */
        (CASE WHEN CHARINDEX('//', @WebAddress)= 0 THEN 1 ELSE CHARINDEX('//', @WebAddress) + 2 END),
        /* Length (ending on first '/' or on a '?') */
        CASE
            WHEN CHARINDEX('/', @WebAddress, CHARINDEX('//', @WebAddress) + 2) > 0 THEN CHARINDEX('/', @WebAddress, CHARINDEX('//', @WebAddress) + 2) - (CASE WHEN CHARINDEX('//', @WebAddress)= 0 THEN 1 ELSE CHARINDEX('//', @WebAddress) + 2 END)
            WHEN CHARINDEX('?', @WebAddress, CHARINDEX('//', @WebAddress) + 2) > 0 THEN CHARINDEX('?', @WebAddress, CHARINDEX('//', @WebAddress) + 2) - (CASE WHEN CHARINDEX('//', @WebAddress)= 0 THEN 1 ELSE CHARINDEX('//', @WebAddress) + 2 END)
            ELSE LEN(@WebAddress)
        END
    ) AS 'HostName'

这将处理......

  • 地址www.(即无计划)
  • //
  • 开头的地址
  • /
  • 结尾的主机名
  • 以查询字符串
  • 结尾的主机名

答案 2 :(得分:1)

使用SQLCLR功能并利用System.Uri类。

答案 3 :(得分:1)

这对我有用:

SELECT
    `url` ,
    LEFT(
        RIGHT(
            `url` ,
            length(`url`) -(position('//' IN `url`) + 1)
        ) ,
        position(
            '/' IN RIGHT(
                `url` ,
                length(`url`) -(position('//' IN `url`) + 1)
            )
        ) - 1
    ) AS domain
FROM
    `test`;

Extract domain name from a URL

答案 4 :(得分:0)

这是代码, 使用子字符串。它适用于.com和.co.in

DECLARE @string VARCHAR(50),  @ind int = 0
SET @string = 'http://stackoverflow.co.in/questions/ask?title=trim'


SET @ind=  charindex('.com', @string)  

IF @ind = 0
BEGIN
    SET @ind=  charindex('.co.in', @string)  
    Print SUBSTRING ( @string ,0 , @ind+6 )
END
ELSE
BEGIN
    Print SUBSTRING ( @string ,0 , @ind +4)
END

答案 5 :(得分:0)

这个怎么样:

DECLARE @Var NVARCHAR(1000)
SET @Var='http://stackoverflow.com/questions/ask?title=trim'

SET @Var=REPLACE(@Var,'http://','')
IF(LEFT(@Var,4)='www.')
    SET @Var=RIGHT(@Var, len(@Var)-4)

IF(PATINDEX('%.com%', @Var)<>0)
    SELECT SUBSTRING(@Var,0, PATINDEX('%.com%', @Var)+4)
ELSE IF (PATINDEX('%.co.%', @Var)<>0)
    SELECT SUBSTRING(@Var,0, PATINDEX('%.co.%', @Var)+6)

答案 6 :(得分:0)

我知道这是一个旧帖子,但我最近尝试这样做,而这里的答案并未涵盖以http/s或新gTLD开头的字符串。因此,我想到的是使用CTE表达式来尝试使其尽可能可读和易懂。

希望将来能帮助任何人绊倒这个主题!

DECLARE @Var NVARCHAR(1000)
SET @Var='http://stackoverflow.com/questions/ask?title=trim';

WITH cteWithoutWWW (Domain)
as
(
    SELECT
      case when PATINDEX('%www.%', @Var) > 0 then
            SUBSTRING(@Var, PATINDEX('%www.%', @Var) + 4, LEN(@Var) - PATINDEX('%www.%', @Var))
      else
            @Var
      end
),
cteWithoutHTTP (Domain)
as
(
      select
      case when PATINDEX('http://%', Domain) > 0 then
            SUBSTRING(Domain, PATINDEX('http://%', Domain) + 7, LEN(Domain) - PATINDEX('http://%', Domain))
      else
            Domain
      end
      from cteWithoutWWW
),
cteWithoutSlash (Domain)
as
(
      select
      case when CHARINDEX('/', Domain) > 0 then
            SUBSTRING(Domain, 0, CHARINDEX('/', Domain))
      else
            Domain
      end
      from cteWithoutHTTP
)
select Domain from cteWithoutSlash 

答案 7 :(得分:0)

我构建了此功能来实现

ALTER FUNCTION fnHostName
(
    @URL varchar(4000)
)
RETURNS varchar(4000)
AS
BEGIN


declare @Dot int
declare @Slash int

set @Dot = CHARINDEX('.', @URL)
set @Slash = CHARINDEX('/', @URL)

WHILE @Slash > 0 AND @Slash < @Dot
BEGIN
    SET @URL = SUBSTRING(@URL,@Slash+1, LEN(@URL))
    set @Dot = CHARINDEX('.', @URL)
    set @Slash = CHARINDEX('/', @URL)
END

IF @Slash > 0 
BEGIN
    SET @URL = LEFT(@URL, @Slash-1)
END

RETURN @URL



END

GO