Ma esiste una locate che cerchi da destra? Perché io sono impazzito…
Nel DB di http://elezioni.softwarelibero.it/ ci sono i dati relativi ai candidati.
La tabella è strutturata così:
CREATE TABLE candidato (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(150) NOT NULL UNIQUE,
accetta TINYINT,
email VARCHAR(150),
telefono VARCHAR(20),
data DATETIME,
partito_id INT
);
Perché c’è il campo nome e non ho messo nome e cognome?
Sarebbe piaciuto molto anche a me, però dovevo fare il parsing dei dati dai dati forniti dal Ministero dell’Interno.
Se andate a vedere i file che il Ministero pubblica (sotto “Politiche: le liste ammesse”) noterete che i il nome e il cognome dei candidati sono inseriti nella stessa cella, discernere l’uno (il nome) dall’altro (il cognome) non è cosa semplice: non tutti si chiamano Paolo Rossi, c’è chi si chiama Paolo Alberto Rossi, Paolo Dei Rossi, Paolo De’ Rossi detto Pinuccio, fare il parsing non è una cosa facile.
Visti i tempi stretti ho semplicemente “buttato” i dati nel DB così, nudi e crudi. Questa semplificazione iniziale però l’ho pagata dopo.
Ed ecco qua cosa ho pagato: per il comunicato (una tantum) i dati dovevo tirarmeli fuori nel formato Cognome Nome (mentre erano dentro come Nome Cognome), la cosa era un pochino complicata, ma ecco una soluzione approssimata: prendo il token più a destra dal campo nome e lo metto a sinistra.
Era necessario quindi selezionare lo spazio più a destra e rompere la stringa in quel punto. Facile. Il problema era farlo con le funzioni sulle stringhe di MySQL e, a meno che non mi sia perso qualcosa, l’unico modo che ho trovato era usare la funzione locate che, come ho detto all’inizio inizia a cercare una sottostringa da sinistra.
Be’ , ecco l’orrida query che ho fatto, me ne vergogno un po’ devo ammettere, infatti chiedo a qualche SQL hacker se mi risolve la situazione con qualcosa di più elegante : ). Ah sì ecco qua il mostro, aspe’ che apro la gabbia:
Leggi il seguito di questo post »