Re: [Talk-it] Domanda postgres

2011-02-25 Per discussione Federico Cozzi
2011/2/24 M∡rtin Koppenhoefer dieterdre...@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

___
Talk-it mailing list
Talk-it@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-it


Re: [Talk-it] Domanda postgres

2011-02-25 Per discussione Luca Delucchi
Il 25 febbraio 2011 10:11, Federico Cozzi f.co...@gmail.com ha scritto:

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


anch'io con postgresql lo faccio così

per esempio

SELECT count(osm_id) FROM planet_osm_roads WHERE oneway = 'yes' OR
oneway = 'true' OR oneway = '1';

questa secondo me è la cosa migliore

 Ciao,
 Federico


-- 
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

___
Talk-it mailing list
Talk-it@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-it


Re: [Talk-it] Domanda postgres

2011-02-25 Per discussione M∡rtin Koppenhoefer
2011/2/25 Federico Cozzi f.co...@gmail.com:

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


si, confermo. E' così.

Martin

___
Talk-it mailing list
Talk-it@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-it


Re: [Talk-it] Domanda postgres

2011-02-25 Per discussione M∡rtin Koppenhoefer
2011/2/25 Luca Delucchi lucadel...@gmail.com:
 Il 25 febbraio 2011 10:11, Federico Cozzi f.co...@gmail.com ha scritto:

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


 anch'io con postgresql lo faccio così

 per esempio

 SELECT count(osm_id) FROM planet_osm_roads WHERE oneway = 'yes' OR
 oneway = 'true' OR oneway = '1';

 questa secondo me è la cosa migliore


Si, anch'io usavo questo metodo finora, ma leggendo la documentazione
mi era venuto l'idea di provare anche l'altro modo (che apparentemente
non faceva quello che volevo).

Visto che mi avete dato delle risposte ottime, mi potete anche
spiegare perché questo:

UPDATE planet_osm_polygon SET name=regexp_replace(name,'fixme','','i')
WHERE name IS NOT NULL AND name ~*'^fixme|$fixme';

mi fa l'update di tutte le righe anche dove non c'è un fixme
contenuto? Se faccio un select:

select name FROM planet_osm_polygon WHERE name IS NOT NULL AND name
~*'^fixme|$fixme';

mi seleziona solo poche righe.

ciao Martin

___
Talk-it mailing list
Talk-it@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-it


Re: [Talk-it] Domanda postgres

2011-02-25 Per discussione M∡rtin Koppenhoefer
2011/2/25 M∡rtin Koppenhoefer dieterdre...@gmail.com:

 UPDATE planet_osm_polygon SET name=regexp_replace(name,'fixme','','i')
 WHERE name IS NOT NULL AND name ~*'^fixme|$fixme';


scusate il rumore, era un typo (fixme$)

ora sto zitto, visto che sono OT.

buona mappatura,
Martin

___
Talk-it mailing list
Talk-it@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-it