Query avanzata: selezionare una parte di una stringa escludendo alcuni caratteri

Come si può selezionare una parte di una stringa escludendo alcuni caratteri?

Ad esempio se della parola “massimo” volessi selezionare solo “si” come posso farlo? E’ questo che mi sono chiesto oggi quando mi sono imbattuto in questa problematica durante una delle attività lavorative.

Ho fatto così un giro tra le stringhe di selezione del selettore di QGIS ed ho trovato quella che cercavo!

Il dato di partenza, in questo caso, è il vettore poligonale della Francia Europea.

query avanzata

Dalla tabella che segue mi interessa selezionare nella colonna “insee” solo quei poligoni il cui codice inizia per 51 e 10.

query avanzata

Ho attivato il selettore tramite espressione e cercando tra le espressioni presenti nella sezione “String” ho trovato quello che cercavo.

La query per raggiungere lo scopo è la seguente:

substr( "insee" , 1,2) is 51 or substr( "insee" , 1,2) is 10

query avanzata

in cui:

  • substr è l’operatore di selezione;
  • insee è il campo in cui l’operatore deve cercare;
  • i numeri 1 e 2 corrispondono al range di ricerca, in questo caso la ricerca deve essere fatta solo nelle prime due posizioni di ogni stringa;
  • i numeri 51 e 10 sono gli obiettivi della ricerca.

Nell’immagine precedente c’è il risultato della selezione, nell’immagine successiva c’è lo zoom all’area selezionata.

Approfondimento

Come molti sapranno, nei software GIS le query SQL sono facilitate. Dietro l’interfaccia grafica di un “Query builder” o un “Select by expression” si cela la sintassi base SQL, quel select X from Y where Z che chi è avvezzo all’uso dei DB conosce bene.

Grazie alle indicazioni di Salvatore Fiandaca, che trovate tra i commenti di questo post,  riporto di seguito la sintassi SQL completa applicabile in un qualunque DB:

select * from francia_europea
where
substr("insee",1,2) is '51' or substr("insee",1,2) is '10'

Queste tre righe sono così definite:

  • l’asterisco dopo select sta ad indicare che si vogliono selezionare tutti i campi della tabella francia_europea;
  • substr è lo stesso comando usato in QGIS.

Traducendo la query di prima si è detto al pc di selezionare(select) tutti i campi(*) della tabella francia_europea(from) in cui è verificata la condizione substr(where).

La query completa eseguita in SpatiaLite, per esempio, ci restituisce la sola selezione dei record tabellari.

Per creare una tabella dalla selezione bisogna anteporre una stringa a quanto scritto in precedenza:

create table area_lavoro as
select * from francia_europea
where
substr("insee",1,2) is '51' or substr("insee",1,2) is '10'

Questo però non è sufficiente a creare anche le geometrie, infatti una volta creata la tabella area_lavoro, bisogna eseguire una nuova query per ottenere le geometrie che possono quindi essere visualizzate in QGIS:

SELECT RecoverGeometryColumn('area_lavoro', 'geom',3857, 'MULTIPOLYGON', 'XY')


Spero che l’articolo possa tornare utile a qualcun altro oltre che a me 🙂

Ecco il video tutorial