Supponiamo di avere un database spatialite con decine di geo-tabelle e di voler conoscere il numero di righe (feature) presenti in ogni geo-tabella: è possibile farlo grazie alla nuova funzione, eval(), introdotta a partire dalla 4.2.1, vediamo come usarla:
SELECT f_table_name,
eval('select count(*) from ' || f_table_name) AS nro_feature
FROM geometry_columns;
e per non riscriverla ogni volta che ci serve, possiamo creare una view:
CREATE VIEW "tab_sinottica" AS
SELECT f_table_name,
eval('select count(*) from ' || f_table_name) AS nro_feature
FROM geometry_columns;
NB: la creazione di una view potrebbe creare un avviso di SICUREZZA e bloccare la view stessa, per maggiori dettagli leggere qui
Riferimenti:
- Home: https://www.gaia-gis.it/fossil/libspatialite/home
- CookBook: https://www.gaia-gis.it/gaia-sins/spatialite-cookbook-5/index.html
- spatialite_gui 2.1.0: http://www.gaia-gis.it/gaia-sins/windows-bin-NEXTGEN-amd64/
Ringraziamenti:
- Alessandro Furieri – papà di Spatialite
Molto utile come al solito!!!
Esiste la stessa query anche per le tabelle senza geometria?
"Mi piace"Piace a 1 persona
Ciao,
non lo so, ma indagherò.
"Mi piace"Piace a 1 persona
Ciao,
ecco una possibile soluzione
SELECT tbl_name,
eval(‘select count(*) from ‘ || tbl_name ) AS nro_righe
FROM sqlite_master
where type=’table’
and name not like ‘%geom%’
and name not like ‘%spatial%’
and name not like ‘%sql%’
and name not like ‘%raster%’
and name not like ‘%SE%’
and name not like ‘%vector_%’
and sql not like ‘%geom%’;
"Mi piace"Piace a 1 persona
Grazie Totò, appena rientro in Ufficio testo subito questa succulenta query!!
"Mi piace"Piace a 1 persona
Grazie Totò, funziona benissimo!!!!
Aggiungo che con una piccola variante nella condizione where:
– sostituendo “and sql not like ‘%geom%’” con “and sql not like ‘%owner%'” (per escludere la tabella layer_stiles ed includere le tabelle geometriche);
mi pare di essere riuscito a contare sia le tabelle geometriche che non geometriche in un colpo solo. Fantastico, veramente utile in Db complessi.
Questa è una query che va abbondantemente oltre la mia infarinatura di SQL (per non parlare della funzione eval) e dunque non sono affatto sicuro della bontà della query modificata anche se pare faccia il suo dovere.
La riporto magari può essere utile:
SELECT tbl_name,
eval(‘select count(*) from ‘ || tbl_name ) AS nro_righe
FROM sqlite_master
where type=’table’
and name not like ‘%geom%’
and name not like ‘%spatial%’
and name not like ‘%sql%’
and name not like ‘%raster%’
and name not like ‘%SE%’
and name not like ‘%vector_%’
and sql not like ‘%owner%’;
Ciao.
"Mi piace"Piace a 1 persona
Sì sì, va benissimo.
ciao
"Mi piace"Piace a 1 persona