Newsgroup: it.comp.software.database
Titolo: SELECT complessa ...

Salve!
Mi ritrovo a dover estrarre dei dati da un DB Postgres in maniera un po'
particolare: faccio un esempio semplificato:
create table miatabella(url varchar(255));
insert into miatabella values('
http://www.sito.com/sezione1/pagina.html'
);
insert into miatabella values('
http://www.sito.com/sezione1/pagina2.php?parametro=54'
);
insert into miatabella values('
http://www.sito.com/sezione1/pagina2.php?parametro=prova'
);
insert into miatabella values('
http://www.sito.com/sezione2/prova.html'
);
insert into miatabella values('
http://www.sito.com/sezione1/pagina.html'
);
insert into miatabella values('
http://www.sito.com/sezione3/sottosezione1/pagina.php?parametro2=abc'
);
insert into miatabella values('
http://www.sito.com/sezione2/prova.html'
);
insert into miatabella values('
http://www.sito.com/sezione3/sottosezione1/pagina.php?parametro=ciao'
);
insert into miatabella values('
http://www.sito.com/sezione3/sottosezione1/pagina.php?parametro2=abc'
);
A questo punto, vorrie estrarre tutte le pagine visitate, cosa fattibile
con:
select distinct(url) from miatabella;
che mi ritorna:
http://www.sito.com/sezione1/pagina.html
http://www.sito.com/sezione1/pagina2.php?parametro=54
 *
http://www.sito.com/sezione1/pagina2.php?parametro=prova
 *
http://www.sito.com/sezione2/prova.html
http://www.sito.com/sezione3/sottosezione1/pagina.php?parametro2=abc
 *
http://www.sito.com/sezione3/sottosezione1/pagina.php?parametro=ciao
 *
e fino a qui nessun problema. Ora però ho 2 casi (quelli segnati con
l'asterisco sopra) in cui la pagina è la stessa, ma è solo il parametro
finale che mi cambia. Vorrei quindi fare in modo che la SELECT mi
ritornasse esattamente:
http://www.sito.com/sezione1/pagina.html
http://www.sito.com/sezione1/pagina2.php
http://www.sito.com/sezione2/prova.html
 
http://www.sito.com/sezione3/sottosezione1/pagina.php
ossia mi eliminasse tutto quello che segue il punto di domanda PRIMA di
considerare il DISTINCT, in modo da ritornarmi esattamente i risultati
che ho scritto poco sopra.
Si può fare in qualche modo a me per ora ignoto?
Al momento lo gestisco in PHP elaborando i dati passati da
select distinct(url) from miatabella
eliminando tutto quello che segue il punto di domanda ed inserendo i
risultati, controllandone l'unicità, in una lista di appoggio ma vorrei
fare in modo, vista la grande quantità di dati, di far fare il grosso
del lavoro direttamente al DB.
Grazie!
Edo

 Si può fare in qualche modo a me per ora ignoto?
select distinct substr(url,1,strpos(url,'?')-1) from miatabella;
ciao
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/gnu/why-gnu-linux.it.html

 select distinct substr(url,1,strpos(url,'?')-1) from miatabella;
Ottimo, cercavo proprio questo!!!
Però, da buon San Tommaso che sono, ho fatto alcune prove di velocità
confrontando quanto da te suggerito con una regexp, tutto in PHP perchè
con il Db non c'è stata via! :-P
Dopo un po' di prove ho visto che (in PHP, ripeto!!):
1) preg_replace("/\?.*/", "", $url);
è più veloce di
2) substr($url, 1, strpos($url, '?')-1);
che a sua volta è più veloce di
3) preg_replace("/\?.*$/", "", $url);
Quindi: 1 e 2 sono equivalenti, la 3 è più precisa ma più lenta, ed in
condizioni normali è equivalenti alle prime due (non so cosa succede in
condizioni "anormali"!).
Mi chiedevo quindi se fosse possibile utilizzare la stessa regexp (la 1)
anche per l'estrazione dei dati con Postgres: nel manuale ho trovato un
riferimento alle regexp, ma non ho visto niente relativo al pattern
substitution ...
Vorrei capire se lo si può fare in modo da vedere se e quanto è più
veloce; idee in questo senso?
Grazie ancora!!
Edo