Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySQL per estrarre i domini dagli URL

Ho dovuto combinare alcune delle risposte precedenti, oltre a un po' più di hackeraggio per il mio set di dati. Questo è ciò che funziona per me, restituisce il dominio e gli eventuali sottodomini:

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain

Spiegazione (perché SQL non banale raramente ha senso):

SUBSTRING_INDEX(target_url, '/', 3) - elimina qualsiasi percorso se l'URL ha un protocollo
SUBSTRING_INDEX(THAT, '://', -1) - rimuove qualsiasi protocollo da QUEL
SUBSTRING_INDEX(THAT, '/', 1) - rimuove qualsiasi percorso da QUEL (se non esisteva il protocollo)
SUBSTRING_INDEX(THAT, '?', 1) - rimuove la stringa di query da QUELLO (se non c'era percorso o finale / )

Casi di prova:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
FROM ( 
    SELECT       'http://test.com' as target_url 
    UNION SELECT 'https://test.com' 
    UNION SELECT 'http://test.com/one' 
    UNION SELECT 'http://test.com/?huh' 
    UNION SELECT 'http://test.com?http://ouch.foo' 
    UNION SELECT 'test.com' 
    UNION SELECT 'test.com/one'
    UNION SELECT 'test.com/one/two'
    UNION SELECT 'test.com/one/two/three'
    UNION SELECT 'test.com/one/two/three?u=http://maaaaannn'
    UNION SELECT 'http://one.test.com'
    UNION SELECT 'one.test.com/one'
    UNION SELECT 'two.one.test.com/one' ) AS Test; 

Risultati:

'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'one.test.com'
'one.test.com'
'two.one.test.com'