2012-12-05 21 views
5

में दिए गए यूआरएल से पार्स डोमेन मैं इस जवाब का झुकाव करता हूं, लेकिन सवाल पर विस्तार करना चाहता था और यहां स्टैक या Google पर खोज के माध्यम से कोई समाधान नहीं मिला।टी-एसक्यूएल

Substring domainname from URL SQL

असल में ऊपर दिया गया लिंक गूगल के नतीजे से पार्स करने की तरह एक साधारण URL "www.google.com" के साथ मेरी समस्या का हल।

मैं उस पर विस्तार करने के लिए क्या देख रहा हूं, उपरोक्त लिंक से समाधान यूआरएल की तरह 'www.maps.google.com' में मदद नहीं करता है जो सिर्फ नक्शे लौटाता है।

मुझे यह पसंद है कि यह 'google' url 'www.maps.google.com' से 'google' लौटाए या 'www.test.example.com' से 'उदाहरण' वापस कर दे।

अगर किसी के पास इसका समाधान है, तो मैं इसकी सराहना करता हूं।

अद्यतन: अधिक विशिष्ट मैं भी आदि दूसरे स्तर डोमेन पर पार्स करने की जरूरत होगी 'www.maps.google.com.au' वापस जाने के लिए होने के लिए 'गूगल'

यहाँ मेरी 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

आप [द्वितीय स्तर के डोमेन] (http://en.wikipedia.org/wiki/Second-level_domain) से निपटना कैसे चाहते हैं, उदा। 'www.google.com.sg' या' bbc.co.uk'? – ig0774

+0

हाँ मैंने अभी दूसरे प्रश्न डोमेन को शामिल करने के लिए अपना प्रश्न अपडेट किया है। मैं 'www.google.com.sg' –

उत्तर

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) 

दृष्टिकोण एक्सएमएल के लिए यूआरएल को बदलने और उसके बाद डोमेन को खोजने के लिए XPath का प्रयोग है।

अद्यतन

द्वितीय-स्तरीय डोमेन के बारे में, मैं केवल विश्वसनीय तरीका यह उन सब को एक तालिका में है करने के लिए विश्वास करते हैं (उच्च-स्तरीय डोमेन शायद बहुत एक तालिका में होना चाहिए) और उसके बाद आप इस इस्तेमाल कर सकते हैं क्वेरी:

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 

इस उदाहरण के लिए उपयोग की जाने वाली टीएलडी/एसएलडी टेबल नीचे दी गई हैं। डोमेन की पूरी सूची इस 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

यही वह है जो मुझे करना था। मुझे सभी टीएलडी एक टेबल में मिला, फिर दूसरे स्तर के डोमेन की एक सूची संकलित की और उसे एक टेबल में रखा और ऊपर अपनी क्वेरी का उपयोग किया। दर्द दूसरे स्तर के डोमेन की एक सूची खोज रहा है। आपके उत्तर के लिए धन्यवाद और इस पर मदद करें। –

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) 

मैं स्ट्रिंग परिवर्तन पर सबसे अच्छा नहीं कर रहा हूँ, इसलिए मैं इसे अपने वास्तव में लंबी लाइन को छोटा करने के लिए संभव है यकीन कोड का असल में, मैं अंतिम अवधि प्राप्त करने के लिए रिवर फ़ंक्शन का उपयोग करता हूं और फिर वहां से जाता हूं। मेरा कोड आखिरी और दूसरे के बीच के अल्पविरामों के बीच के पात्रों को लाता है।

ध्यान रखें कि www.test.co.uk जैसी वेबसाइट का उपयोग मेरे समाधान के साथ काम नहीं करेगा। मैं प्रस्ताव दूंगा कि यह केवल एक शुरुआती बिंदु है, और आपको आउटलाइनर्स के लिए कोड करना होगा।

+0

से 'google' को भी वापस करना चाहता हूं जो कि केवल एक एक्सटेंशन के लिए बहुत अच्छा काम करता है। क्या होगा और मुझे अपने प्रश्न में और अधिक विशिष्ट होना चाहिए था, तो कहें कि यूआरएल 'www.maps.google.com.au' है। आपका उत्तर 'कॉम' देता है। इसके अलावा, यह उत्तर बहुत अच्छा काम करता है और आपकी प्रतिक्रिया के लिए धन्यवाद। –

+0

आप बिल्कुल सही हैं। जिस समस्या का आप जा रहे हैं वह सभी संभावित आउटलाइर्स है। मैं सर्ज के सुझाव के समान कुछ सुझाऊंगा, और संदर्भित होने के लिए आउटलेटर्स को एक टेबल में रखूंगा। हम इंसानों को आसानी से आपके इच्छित डेटा की पहचान कर सकते हैं, लेकिन दुर्भाग्य से कंप्यूटर नहीं कर सकता है। यह वास्तव में इस बात पर निर्भर करता है कि आपको कितनी सटीक आवश्यकता है। साथ ही, जहां तक ​​स्केलेबिलिटी जाती है, मैं फिर से यह समझने की कोशिश करता हूं कि सर्ज उसके पद में क्या कर रहा है। मेरी विधि त्वरित और गंदा है, लेकिन यदि आपको अधिक तर्क जोड़ने की आवश्यकता है तो शायद यह सबसे अच्छा मार्ग नहीं है। – Neil

2

PARSENAME "।" से अलग चार आइटम तक विभाजित होगा। निशान। पार्सनाम सही से गिना जाता है। यदि parse के ऑब्जेक्ट_नाम में चार से अधिक भाग हैं तो NULL को फिर से चालू कर दिया जाएगा।

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

यह कुछ मामलों में काम करता है लेकिन मुझे जिस स्तर की आवश्यकता है, उस पर नहीं, आपके उत्तर के लिए धन्यवाद –

4

टीएलडी मुद्दा वास्तव में आपके कोड को धीमा कर सकता है, और एक रखरखाव आवश्यकता जोड़ सकता है, इसलिए मैंने सबडोमेन शामिल करने का निर्णय लिया।यहां मैं उपयोग करता हूं:

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

मैंने जो किया वह प्रोटोकॉल '// //' के बाद यूआरएल को प्रतिस्थापित कर रहा है।

मैं तब उस स्ट्रिंग को लेता हूं और सभी पाठ को पहले फॉरवर्ड स्लैश तक घटा देता हूं।

यदि आप इसे किसी प्रश्न के लिए चाहते हैं, तो इसे एक लाइन में भी कर सकते हैं, या इसे स्केलर फ़ंक्शन के रूप में उपयोग करें जैसा मैं चाहता हूं।

साथ ही, सामान्य रूप से नल या केवल खराब तारों की जांच के लिए कुछ कोड जोड़ने का अच्छा विचार होगा। यदि आप इसे कोड की एक पंक्ति के रूप में रखना चाहते हैं, तो ISNULL और NULLIF फ़ंक्शंस का उपयोग करने का प्रयास करें।

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

आपको कुछ स्पष्टीकरण जोड़ना चाहिए। –