sql >> Database >  >> RDS >> Mysql

Mysql-query om domeinen uit URL's te extraheren

Ik moest een aantal van de eerdere antwoorden combineren, plus een beetje meer hacking voor mijn dataset. Dit is wat voor mij werkt, het geeft het domein en eventuele subdomeinen terug:

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

Uitleg (want niet-triviale SQL heeft zelden zin):

SUBSTRING_INDEX(target_url, '/', 3) - verwijdert elk pad als de url een protocol heeft
SUBSTRING_INDEX(THAT, '://', -1) - verwijdert elk protocol van THAT
SUBSTRING_INDEX(THAT, '/', 1) - verwijdert elk pad van DAT (als er geen protocol was)
SUBSTRING_INDEX(THAT, '?', 1) - verwijdert de queryreeks van DAT (als er geen pad of volg / ) was

Testgevallen:

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; 

Resultaten:

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


  1. Draaien op meerdere kolommen met Tablefunc

  2. syntaxisfout voor mysql-declaratie van variabele

  3. Hoe voeg je gewichten toe aan een MySQL-tabel en selecteer je willekeurige waarden volgens deze?

  4. Trage prestaties van SqlDataReader