J'ai dû combiner certaines des réponses précédentes, plus un peu plus de piratage pour mon ensemble de données. C'est ce qui fonctionne pour moi, il renvoie le domaine et tous les sous-domaines :
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
Explication (car SQL non trivial a rarement du sens) :
SUBSTRING_INDEX(target_url, '/', 3) - supprime tout chemin si l'url a un protocoleSUBSTRING_INDEX(THAT, '://', -1) - supprime tout protocole de CELASUBSTRING_INDEX(THAT, '/', 1) - supprime tout chemin de CELA (s'il n'y avait pas de protocole)SUBSTRING_INDEX(THAT, '?', 1) - supprime la chaîne de requête de CELA ( s'il n'y avait pas de chemin ou de / )
Scénarios de test :
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
FROM (
SELECT 'https://test.com' as target_url
UNION SELECT 'https://test.com'
UNION SELECT 'https://test.com/one'
UNION SELECT 'https://test.com/?huh'
UNION SELECT 'https://test.com?https://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=https://maaaaannn'
UNION SELECT 'https://one.test.com'
UNION SELECT 'one.test.com/one'
UNION SELECT 'two.one.test.com/one' ) AS Test;
Résultats :
'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'