MySQL-MariaDB come cercare in una stringa con valori separati da virgola

23 giugno 2016

​Supponiamo di avere un campo varchar il cui contenuto sia una sequenza di caratteri numerici separati da virgola. I numeri potrebbero rappresentare i gruppi cui appartiene un utente, dove è implicito che un utente possa appartenere a più gruppi.
Se vogliamo selezionare gli utenti appartenenti ad uno specifico gruppo l'utilizzo di LIKE potrebbe portare ad errori:
MariaDB >SELECT * FROM utenti WHERE gruppi LIKE '%1%'; 
Questa query infatti ci restituirà sia gli utenti appartenenti al gruppo 1 che, ad esempio, al gruppo 12.....che non è il risultato cercato.
A toglierci le castagne dal fuoco c'è la funzione FIND_IN_SET che fornisce la posizione della stringa cercata e, nel caso non sia presente, restituisce 0.
MariaDB > SELECT FIND_IN_SET('1','5,7,2,1,9');
+------------------------------+
| FIND_IN_SET('1','5,7,2,1,9') |
+------------------------------+
| 4 |
+------------------------------+
Come si vede nell'esempio il valore restituito 4 ci dice che la stringa '1' si trova nella posizione 4. Mentre nel caso in cui tra i valori separati da virgola ci sia 12 anzichè 1:
MariaDB > SELECT FIND_IN_SET('1','5,7,2,12,9');
+------------------------------+
| FIND_IN_SET('1','5,7,2,12,9') |
+-------------------------------+
| 0 |
+-------------------------------+
Lo 0 ci dirà che la stringa '1' non c'è tra i valori separati da virgola.
 
Ritornando all'esempio precedente potremo modificare la query nel seguente modo:
MariaDB >SELECT * FROM utenti WHERE FIND_IN_SET('1',gruppi) <> 0; 

A scanso di equivoci stiamo parlando di stringhe non di numeri:
MariaDB > SELECT FIND_IN_SET('ef','ab,dd,ef,fgrt,gtyu');
+----------------------------------------+
| FIND_IN_SET('ef','ab,dd,ef,fgrt,gtyu') |
+----------------------------------------+
| 3 |
+----------------------------------------+