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
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)