Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Mysql : Estrarre dati numerici da una colonna

Un utile snippet di codice che ci consente di estrarre, da una tabella, soltanto i record con valori numerici (oppure solo quelli con valori alfanumerici). Un'occasione per capire il meccanismo delle espressioni regolari in Mysql

Mysql

Ipotizziamo di voler estrarre, da un database, tutti i record di una determinata colonna che contengono solo valori numerici. Mysql supporta le espressioni regolari, con tutta la potenza che ne consegue, per cui possiamo risolvere con questa semplice query:


select * from tabella
where miacolonna regexp '^-?[[:digit:]]{1,}$'


A questo punto divnta semplice ottenere il risultato contrario, quello di selezionare solo i dati privi di numeri:


select * from tabella
where miacolonna regexp '^[[:alpha:]]{1,}$'

Notate che nel primo esempio ho inserito anche un "-?" iniziale, per consentire la selezione dei numeri negativi.

I delimitatori ^ e $ consentono di delimitare la ricerca (per cui nel primo caso verranno trovati solo record il cui valore inizia, prosegue e finisce con un numero e nel secondo caso solo i record il cui valore inizia, prosegue e finisce con un carattere lettera). In pratica solo record che siano esclusivamente numeri o esclusivamente stringhe.

Un valore "test54" non verrebbe rilevato in nessun caso, perchè inizia con una lettera e finisce con un numero. Se si desidera trovare anche questo tipo di risultati, considerandoli verosimilmente come alfanumerici, basta rimuovere i delimitatori dal secondo esempio:

select * from tabella
where miacolonna regexp '[[:alpha:]]{1,}'

visto che la presenza di 1 sola lettera è sufficiente per escludere che il valore sia un numero, questa espressione ci consente di trovare qualsiasi corrispondenza che non sia esclusivamente numerica.

Le due query non restituiscono i valori NULL, facilmente implementabili con una clausola OR:

select * from tabella
where (miacolonna regexp '[[:alpha:]]{1,}' or miacolonna is null)