5

私はこの答えを見つけましたが、質問を拡大したかったので、ここでスタック上またはGoogleを検索しても解決策を見つけることができませんでした.

URL SQL からの部分文字列ドメイン名

基本的に、上記のリンクは、Googleの結果で「www.google.com」を解析するような単純なURLで私の問題を解決します。

それを拡張するために私が探しているのは、上記のリンクからのソリューションは、マップを返すだけの「www.maps.google.com」のようなURLでは役に立たないということです。

私が望むのは、URL「www.maps.google.com」から「google」を返すか、「www.test.example.com」から「example」を返すようにすることです。

誰かがこれに対する解決策を持っているなら、私はそれを大いに感謝します.

更新: より具体的には、第 2 レベルのドメインなどの解析も必要になります。「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
4

5 に答える 5

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)

アプローチは、URL を XML に変換してから、XPath を使用してドメインを見つけることです。

アップデート

第 2 レベルのドメインに関しては、それらすべてをテーブルに含めることが唯一の信頼できる方法だと思います (トップレベルのドメインもおそらくテーブルにあるはずです)。次に、次のクエリを使用できます。

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

この例で使用した 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')
于 2012-12-05T23:16:17.873 に答える
3

誰かがおそらくより良い解決策を持っているでしょうが、ここに私が得たものがあります:

LEFT(RIGHT(@strURL, CHARINDEX('.', REVERSE(@strURL)) +  CHARINDEX('.', SUBSTRING(REVERSE(@strURL), CHARINDEX('.', REVERSE(@strURL)) + 1, LEN(@strURL))) - 1), CHARINDEX('.', SUBSTRING(REVERSE(@strURL), CHARINDEX('.', REVERSE(@strURL)) + 1, LEN(@strURL))) - 1)

私は文字列操作が得意ではないので、非常に長いコード行を短縮できると確信しています。基本的に、REVERSE 関数を使用して最後の期間を取得し、そこから移動します。私のコードは、最後のコンマと最後から 2 番目のコンマの間の文字を取り込みます。

www.test.co.uk などの Web サイトを使用しても、私のソリューションでは機能しないことに注意してください。これは単なる出発点であり、外れ値をコーディングする必要があることを提案します。

于 2012-12-05T23:15:05.843 に答える
2

PARSENAME は、「.」で区切られた最大 4 つの項目に分割されます。マーク。パースネームは右から数えます。解析する object_name に 5 つ以上の部分がある場合、NULL が返されます。

select PARSENAME ( REPLACE('www.maps.google.com.au', 'www.','')  , 3 ) 
select PARSENAME ( REPLACE('www.maps.google.com', 'www.','')  , 2 ) 
于 2012-12-06T23:02:23.447 に答える