sql >> Base de Datos >  >> RDS >> Mysql

Consulta mysql para extraer dominios de urls

Tuve que combinar algunas de las respuestas anteriores, además de un poco más de piratería para mi conjunto de datos. Esto es lo que funciona para mí, devuelve el dominio y cualquier subdominio:

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

Explicación (porque SQL no trivial rara vez tiene sentido):

SUBSTRING_INDEX(target_url, '/', 3) - elimina cualquier ruta si la URL tiene un protocolo
SUBSTRING_INDEX(THAT, '://', -1) - quita cualquier protocolo de ESO
SUBSTRING_INDEX(THAT, '/', 1) - elimina cualquier ruta de ESO (si no hubiera protocolo)
SUBSTRING_INDEX(THAT, '?', 1) - elimina la cadena de consulta de ESO (si no hubiera una ruta o / final)

Casos de prueba:

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; 

Resultados:

'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'