Mai capitato di avere la necessità di concatenare il contenuto di più campi in un unico campo utilizzando MySQL?
Un esempio? Beh si supponga di avere una procedura che richiedere per un medesimo valore tre scelte possibili selezionabili utilizzando tre combo box distinte. Al giorni d’oggi esistono widget e plugin che consentono di sostituire questa gestione “vecchia scuola” con una unica combo box multiselect!

Tralasciando la scelta del plugin javascript (jQuery, Bootstrap.. c’è solo l’imbarazzo della scelta!) uno dei problemi in cui ci si imbatte è quello di allineare la struttura del database con la nuova modalità di gestione.

A me è capitato e, fortunello me, il database in oggetto era MySQL!
Fortunatamente esiste una soluzione non molto complicata. (visto il periodo e la mole di imprecazione che in un primo momento questa necessità ha suscitato in me!)

In MySQL esiste la funzione concat_ws (dove ws sta per with separator ) che consente di concatenare N stringhe o campi indicando anche il separatore.
Ma c’è di più: se uno dei valori da concatenare è NULL la procedura è sufficientemente intelligente da ometterlo! Fantastico!

Ahimè, nel mio caso servirebbe un’altra funzionalità: la possibilità di omettere anche i valori duplicati.
Si supponga ad esempio che i valori da concatenare coincidano. Non ha senso riportare lo stesso valore più volte, sarebbe ottimale rimuovere le occorrenze duplicate.

Ci ho ragionato un attimo e stavo quasi per scrivere due righe di PHP per risolvere tramite uno script ad-hoc però.. aspetta… forse…

UPDATE tabella SET nuovo_campo = CONCAT_WS(",", campo1, IF (campo2=campo1 || campo2=campo3, NULL, campo2), IF (campo3=campo1 || campo3=campo2, NULL, campo3) )

… uno spettacolo!

In questo modo si riesce a risolvere velocemente e in maniera efficiente, e bravo MySQL!
…. anche se so già che a breve me ne combinerai qualcuna delle tue e mi farai imprecare ma per stavolta va bene così! 😉

MySQL : concatenare più campi con separatore

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *