从T-SQL中的给定URL解析域

Ada*_*m N 5 sql t-sql sql-server url parsing

我得到了这个答案,但想扩展这个问题,在堆栈上或通过搜索谷歌找不到任何解决方案.

来自URL SQL的子字符串域名

基本上上面的链接用一个简单的URL解决了我的问题,比如使用google解析"www.google.com".

我想要扩展的是上面的链接解决方案没有帮助像只返回地图的"www.maps.google.com"网址.

我想要的是让它从网址'www.maps.google.com'返回'google'或从'www.test.example.com'返回'example'.

如果有人有解决方案,我将非常感激.

更新:更具体地说,我还需要在二级域名等解析'www.maps.google.com.au'以返回'google'

这是我的Sql函数.

CREATE FUNCTION [dbo].[parseURL]  (@strURL varchar(1000))
RETURNS varchar(1000)
AS
BEGIN

IF CHARINDEX('.', REPLACE(@strURL, 'www.','')) > 0
SELECT @strURL = LEFT(REPLACE(@strURL, 'www.',''), CHARINDEX('.',REPLACE(@strURL,              'www.',''))-1)
Else
SELECT @strURL = REPLACE(@strURL, 'www.','')

RETURN @strURL
END
Run Code Online (Sandbox Code Playgroud)

Ser*_*lov 7

我建议这个

DECLARE @URL nvarchar(max) = 'www.maps.google.com'

DECLARE @X xml = CONVERT(xml,'<root><part>' + REPLACE(@URL, '.','</part><part>') + '</part></root>')

SELECT [Domain] = T.c.value('.','varchar(20)')
FROM @X.nodes('/root/part[position() = last() - 1]') T(c)
Run Code Online (Sandbox Code Playgroud)

方法是将URL转换为XML,然后使用XPath查找域.

UPDATE

关于二级域名,我相信唯一可靠的方法是将它们全部放在一个表格中(顶级域名也应该在一个表格中)然后你可以使用这个查询:

DECLARE @URL nvarchar(max) = 'www.maps.google.com'

DECLARE @X xml = CONVERT(xml,'<root><part>' + REPLACE(REVERSE(@URL), '.','</part><part>') + '</part></root>')

;WITH SplitCTE AS
(
    SELECT
        (SELECT REVERSE(T.c.value('.', 'nvarchar(256)')) FROM @X.nodes('/root/part[. = ../part[position() = 1]]') T(c)) AS TLD,
        (SELECT REVERSE(T.c.value('.', 'nvarchar(256)')) FROM @X.nodes('/root/part[. = ../part[position() = 2]]') T(c)) AS D2,
        (SELECT REVERSE(T.c.value('.', 'nvarchar(256)')) FROM @X.nodes('/root/part[. = ../part[position() = 3]]') T(c)) AS D3
)
SELECT 
    CASE
        WHEN SLD.Domain IS NULL THEN S.D2 ELSE S.D3
    END AS Domain
FROM
    SplitCTE AS S
    LEFT JOIN TLD ON TLD.Domain = S.TLD
    LEFT JOIN SLD ON SLD.Domain = S.D2
Run Code Online (Sandbox Code Playgroud)

我在本例中使用的TLD/SLD表如下.域名的完整列表在此Wiki中.小心使用,NVARCHAR因为一些是本地化的.

CREATE TABLE dbo.TLD
(
    Domain nvarchar(10)
)
GO

CREATE TABLE dbo.SLD
(
    Domain nvarchar(10)
)
GO

INSERT TLD VALUES ( 'com')
INSERT TLD VALUES ( 'uk')
INSERT SLD VALUES ( 'co')
Run Code Online (Sandbox Code Playgroud)