2010-07-31 15 views
1

Je suis en train d'utiliser this script (qui extrait le domaine d'une URL):Essayer d'utiliser une fonction SQL dans MySQL

CREATE FUNCTION [dbo].[parseURL] (@strURL varchar(1000)) 
RETURNS varchar(1000) 
AS 
BEGIN 
IF CHARINDEX('http://',@strURL) > 0 OR CHARINDEX('https://',@strURL) > 0 
SELECT @strURL = REPLACE(@strURL,'https://','') 
SELECT @strURL = REPLACE(@strURL,'http://','') 
SELECT @strURL = REPLACE(@strURL,'www','') 
-- Remove everything after "/" if one exists 
IF CHARINDEX('/',@strURL) > 0 (SELECT @strURL = LEFT(@strURL,CHARINDEX('/',@strURL)-1))  
RETURN @strURL 
END 

Cette commande SQL:

SELECT COUNT(*) as theCount, dbo.parseURL(url) as url FROM hit 
WHERE url IS NOT NULL 
GROUP BY dbo.parsedomain(url) 
ORDER BY thecount DESC 

Mais je m reçoit cette erreur:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[dbo].[parseURL] (@strURL varchar(1000)) RETURNS varchar(1000) AS BEGIN IF ' at line 1 

Je suis relativement nouveau à la fois SQL et MySQL, donc pas sûr si l'erreur est SQL général ou My SQL-spécifique. Qu'est-ce que je rate?

+0

La fonction est pour SQL Server, en utilisant TSQL - il ne fonctionnera jamais comme-est sur MySQL. –

+0

Intéressant. Que recommanderiez-vous d'utiliser MySQL, alors? – Dan

+0

Yup. Travailler sur une version MySQL ... Maintenant. – quantumSoup

Répondre

3

est ici la fonction MySQL équivalente:

DELIMITER $$ 

CREATE FUNCTION parseURL(strURL VARCHAR(200)) 
    RETURNS varchar(200) 
BEGIN 

    IF INSTR(strURL, 'http://') > 0 OR INSTR(strURL, 'https://') > 0 THEN 
    SET strURL = REPLACE(strURL,'https://',''); 
    SET strURL = REPLACE(strURL,'http://',''); 
    SET strURL = REPLACE(strURL,'www',''); 
    -- Remove everything after "/" if one exists 
    IF INSTR(strURL, '/') > 0 THEN 
    SET strURL = LEFT(strURL, INSTR(strURL, '/')-1); 
    END IF; 
    END IF; 

    RETURN strURL; 
END 

Utilisez cette requête:

SELECT COUNT(*) as theCount, 
     parseURL(url) as url 
    FROM hit 
    WHERE url IS NOT NULL 
GROUP BY parseURL(url) 
ORDER BY thecount DESC 
+0

Merci beaucoup, OMG Ponies - ça a bien marché! – Dan

4

Jésus-Christ Ponies, gaspillage d'efforts, mais voici:

DELIMITER | 
CREATE FUNCTION DOMAIN (url VARCHAR(255)) 
RETURNS VARCHAR(255) DETERMINISTIC 
    BEGIN 
    DECLARE pos INT; 
    SET pos := LOCATE('://', url); 
    SET url := CASE WHEN pos=0 THEN url ELSE SUBSTR(url, pos+3) END; 
    SET url := REPLACE(url,'www.',''); 
    RETURN SUBSTRING_INDEX(url, '/', 1); 
    END 

Puis requête:

SELECT COUNT(*) as theCount,  
     DOMAIN(url) as url  
    FROM hit 
    WHERE url IS NOT NULL 
GROUP BY url 
ORDER BY thecount DESC 

Ma fonction a l'avantage de dépouiller tout protocole, https, http, ftp, quelle que soit

+0

+1: Je pense que le vôtre est plus efficace - je faisais juste un changement rapide et sale. –

+0

@OMG Probablement. J'ai tiré un tas d'URLs aléatoires de certains fichiers urllist.txt (environ 25000 d'entre eux) et a exécuté les fonctions. Le mien a obtenu une moyenne d'environ 0.52s, le vôtre autour de 0.73s. – quantumSoup