2012-12-05 3 views
5

이 답변을 얻었지만 질문을 확장하고 싶거나 스택 검색 또는 Google 검색을 통해 해결책을 찾을 수 없습니다.T-SQL에서 지정된 URL의 도메인 구문 분석

Substring domainname from URL SQL

는 기본적으로 링크는 위의 구글의 결과 분석 같은 간단한 URL "www.google.com"내 문제를 해결한다.

위의 링크를 통해 해결책을 찾고 있는데,지도를 반환하는 'www.maps.google.com'과 같은 URL은 도움이되지 않습니다.

내가 원하는 것은 'www.maps.google.com'URL에서 'google'을 반환하거나 'www.test.example.com'에서 'example'을 반환하는 것입니다.

누구에게도 해결책이 있다면 크게 감사하겠습니다.

업데이트 : 나는 또한 반환 'www.maps.google.com.au'등 2 단계 도메인에 구문 분석이 필요합니다 구체적으로는 '구글'

여기 내 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 
+1

[2 단계 도메인] (http://en.wikipedia.org/wiki/Second-level_domain)을 어떻게 처리 하시겠습니까? 'www.google.com.sg' 또는'bbc.co.uk'? – ig0774

+0

예 2 단계 도메인을 포함하도록 질문을 업데이트했습니다. 나는 또한 'www.google.com.sg'에서 'google'을 원합니다. –

답변

6

나는이

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) 

접근 방식은 XML에 URL을 변환 한 다음 도메인을 찾기 위해 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 

이 예제에 사용 된 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') 
+0

이것이 내가해야 할 일이다. 모든 TLD를 하나의 테이블에 넣은 다음 2 차 레벨 도메인 목록을 컴파일하여 테이블에 배치하고 위의 쿼리를 사용했습니다. 통증은 두 번째 레벨 도메인의 목록을 찾는 것입니다. 답변 해 주셔서 감사합니다. –

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 함수를 사용하여 마지막 마침표를 얻은 다음 거기에서부터 이동합니다. 내 코드는 마지막 쉼표와 마지막 쉼표 사이의 문자를 가져옵니다.

www.test.co.uk와 같은 웹 사이트를 사용하면 내 솔루션이 작동하지 않는다는 점에 유의하십시오. 나는 그것이 단지 출발점 일 뿐이라고 제안 할 것이고, 당신은 이상 치를 작성해야 할 것이다.

+0

확장자가 하나 인 항목에 유용합니다. 내 질문에 구체적으로 설명해야한다면 무엇이 필요하며, 따라서 URL은 'www.maps.google.com.au'입니다. 귀하의 답변은 'com'을 반환합니다. 그 외에도이 답변은 훌륭하게 작동했으며 응답에 감사드립니다. –

+0

당신은 절대적으로 옳습니다. 당신이 가지고있는 문제는 가능한 모든 특이 치입니다. 나는 Serge가 제안한 것과 비슷한 것을 추천 할 것이고, 특이 치를 테이블에 넣어 참조 할 것이다. 우리는 인간이 원하는 데이터를 쉽게 식별 할 수 있지만 유감스럽게도 컴퓨터로는 불가능합니다. 정말 얼마나 정확하게 당신이 필요에 따라 달라집니다. 또한 확장성에 관한 한, Serge가 자신의 게시물에서 무엇을하고 있는지 이해하려고 노력할 것을 제안합니다. 내 방식은 빠르고 빠르지 만 논리를 더 추가해야하는 경우에는 가장 좋은 방법은 아닙니다. – Neil

2

PARSENAME은 "."문자로 구분 된 최대 4 개의 항목으로 나뉩니다. 표. Parsename은 오른쪽에서부터 계산됩니다. 구문 분석 할 object_name에 4 개 이상의 부분이 있으면 NULL이 다시 실행됩니다.

select PARSENAME (REPLACE('www.maps.google.com.au', 'www.','') , 3) 
select PARSENAME (REPLACE('www.maps.google.com', 'www.','') , 2) 
+0

일부 인스턴스에서는 작동하지만 레벨이 필요하지는 않습니다. 회신에 감사드립니다. –

4

TLD 문제로 인해 코드 속도가 느려지고 유지 관리 요구 사항이 추가되어 하위 도메인을 포함하기로 결정했습니다.다음은 내가 사용하는 것입니다 :

ALTER FUNCTION dbo.spExtractDomainFromURL (@strURL NVARCHAR(1000)) 
RETURNS NVARCHAR(100) 
AS 
BEGIN 
    --Strip Protocol 
    SELECT @strURL = SUBSTRING(@strURL, CHARINDEX('://', @strURL) + 3, 999) 

    -- Strip www subdomain 
    IF LEFT(@strURL, 4) = 'www.' 
     SELECT @strURL = SUBSTRING(@strURL, 5, 999) 

    -- Strip Path 
    IF CHARINDEX('/', @strURL) > 0 
     SELECT @strURL = LEFT(@strURL, CHARINDEX('/', @strURL) - 1) 

    RETURN @strURL 
END 
2

여기에서 수행 한 작업은 ': //'프로토콜 다음의 하위 문자열입니다.

그런 다음 해당 문자열을 가져 와서 모든 텍스트를 첫 번째 슬래시로 나눕니다.

쿼리에 필요한 경우 한 줄로 입력하거나 원하는 경우 스칼라 함수로 사용할 수 있습니다.

또한 null을 확인하거나 일반적으로 잘못된 문자열을 확인하는 코드를 추가하는 것이 좋습니다. 한 줄의 코드로 유지하려면 ISNULL 및 NULLIF 함수를 사용해보십시오.

DECLARE @urlSansProtocol VARCHAR(MAX) 
SET @urlSansProtocol = Substring(@url, CharIndex('://', @url)+3 ,LEN(@url)) 
RETURN Substring(@urlSansProtocol, 0 ,CharIndex('/', @urlSansProtocol)) 
+2

몇 가지 설명을 추가해야합니다. –

관련 문제