2011-08-02 2 views
0

Sans avoir besoin de SQLCLR pour utiliser un Regex en C#, quel est le meilleur moyen d'obtenir juste la "racine" d'une URL à partir d'une table avec 500 millions de lignes? La colonne est VarChar (3000) et la table contient des lignes comme ceci:SQL Server Obtenir l'URL à partir de TSQL uniquement?

http://a.com 
http://b.au 
http://c.edu?a=3 
http://d.com/?a=3 
http://d.com/?a=3&b=2 
http://d.com/?a=3&b=2 

je dois choisir entre la table et obtenir ce jeu de résultats:

http://a.com    1 
http://b.au    1 
http://c.edu    1  
http://d.com    3 

Merci.

Répondre

2

;with test (url) as (
    select 'http://a.com' union 
    select 'http://b.au' union 
    select 'http://c.edu?a=3' union 
    select 'http://d.com/?a=3' union 
    select 'http://d.com/?a=3&b=2' union all 
    select 'http://d.com/?a=3&b=2' 
) 
select 
    rtrim(replace(left(url, charindex('?', url + '?', 1) - 1) + ' ', '/ ', '')) 
from test 


>>> 
http://a.com 
http://b.au 
http://c.edu 
http://d.com 
http://d.com 

Modification

...,COUNT(*) 
from test 
    group by rtrim(replace(left(url, charindex('?', url + '?', 1) - 1) + ' ', '/ ', '')) 

pour le groupe.

+0

Si vous souhaitez le faire en T-SQL pur, c'est la voie à suivre. Cependant, en fonction de l'état final souhaité, il est préférable de faire la mise en forme de la chaîne dans votre application ou dans les couches de présentation. La mise en forme de chaîne n'est tout simplement pas l'une des forces de SQL. – TimothyAWiseman

3

Si toutes vos URL "tiges" se terminent par "?" ou '/?', vous pouvez l'utiliser. Des modèles de coupure supplémentaires peuvent être ajoutés dans les instructions CASE si nécessaire:

DECLARE @test TABLE (URL varchar(3000)) 

INSERT INTO @test (URL) VALUES ('http://a.com') 
INSERT INTO @test (URL) VALUES ('http://b.au') 
INSERT INTO @test (URL) VALUES ('http://c.edu?a=3') 
INSERT INTO @test (URL) VALUES ('http://d.com/?a=3') 
INSERT INTO @test (URL) VALUES ('http://d.com/?a=3&b=2') 
INSERT INTO @test (URL) VALUES ('http://d.com/?a=3&b=2') 

SELECT SUBSTRING(URL, 0, 
    CASE 
     WHEN PATINDEX('%/?%', URL) > 0 THEN PATINDEX('%/?%', URL) 
     WHEN PATINDEX('%?%', URL) > 0 THEN PATINDEX('%?%', URL) 
     ELSE LEN(URL) + 1 
    END), COUNT(*) 
FROM @test 
GROUP BY SUBSTRING(URL, 0, 
    CASE 
     WHEN PATINDEX('%/?%', URL) > 0 THEN PATINDEX('%/?%', URL) 
     WHEN PATINDEX('%?%', URL) > 0 THEN PATINDEX('%?%', URL) 
     ELSE LEN(URL) + 1 
    END) 
Questions connexes