[Talk-it] Domanda postgres

Federico Cozzi f.cozzi at gmail.com
Fri Feb 25 09:11:01 GMT 2011


2011/2/24 M∡rtin Koppenhoefer <dieterdreist at gmail.com>:
> Scusate, se sono un po' OT, ho fatto delle prove e non capisco il risultato:
>
> echo "select count(oneway='yes') from planet_osm_roads" | psql -d gis
>  count
> --------
>  480928
>
> echo "select count(*) from planet_osm_roads where oneway='yes';" | psql -d gis
>  count
> --------
>  460284
>
>
> come mai la risposta è diversa? Sono andato avanti, qui rimane uguale:
>
> echo "select count(oneway='yes' or oneway='true') from
> planet_osm_roads" | psql -d gis
>  count
> --------
>  480928
>
> mentre qui aumenta:
>
> echo "select count(*) from planet_osm_roads where oneway='yes' or
> oneway='true'" | psql -d gis
>  count
> --------
>  470139
>
>
> echo "select count(*) from planet_osm_roads where oneway='yes' or
> oneway='true' or oneway='1'" | psql -d gis
>  count
> --------
>  471498
>
>
> C'è qualcuno tra di voi chi sa perché ricevo risposte diverse? (Per le
> richiesto dove cerco "true" e "1" nell WHERE è chiaro, ma perché
> l'espressione dentro al count crea un risultato leggermente diverso?

Non ho sottomano Postgresql per fare prove.
Di solito con Oracle non metto mai il filtro all'interno della COUNT:
va messo nella WHERE.

Dai tuoi numeri, le uniche "stranezze" sono:
select count(oneway='yes') from planet_osm_roads: 480928
select count(oneway='yes' or oneway='true') from planet_osm_roads: 480928
Questi numeri sono uguali tra loro e maggiori di tutti gli altri

Dalla documentazione di Postgresql:
http://www.postgresql.org/docs/8.2/static/functions-aggregate.html
"number of input rows for which the value of expression is not null"
mi chiedo se quelle SELECT non stiano in effetti restituendo il numero
totale di record dove "oneway IS NOT NULL"

Cioè io sospetto che:
SELECT count(1) FROM planet_osm_roads WHERE oneway = 'yes' : 460284
SELECT count(1) FROM planet_osm_roads WHERE oneway = 'yes' OR oneway =
'true':  470139
SELECT count(1) FROM planet_osm_roads WHERE oneway = 'yes' OR oneway =
'true' OR oneway = '1' :  471498
SELECT count(1) FROM planet_osm_roads WHERE oneway IS NOT NULL :  480928
(ci sono anche oneway='no' e tanti altri possibili valori...)

Ciao,
Federico



More information about the Talk-it mailing list