SpatiaLite e la funzione eval() SQL

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:

spatialite_gui: database con 16 geotabelle
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:

Ringraziamenti:

  • Alessandro Furieri – papà di Spatialite

6 pensieri su “SpatiaLite e la funzione eval() SQL

      1. 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%’;

        Piace a 1 persona

  1. 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.

    Piace a 1 persona

Rispondi a Totò Cancella risposta

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.