Ho una funzione che attualmente utilizzo in PHP che compila un indirizzo postale da campi separati ma tiene conto di diversi formati utilizzato in diverse regioni. Sto cercando di replicare questo come una funzione memorizzata MySQL. Mi rendo conto che è spesso più veloce fare questo genere di cose in codice piuttosto che nel database, ma la nostra intranet ha un modo per le persone di immettere comandi MySQL SELECT in sola lettura in modo da poter costruire ricerche avanzate e salvare le query. Questa particolare funzione verrà utilizzata in modo che gli utenti possano inviare i risultati delle query di ricerca avanzate a un layout di etichetta.Funzione memorizzata MySQL con IF annidato END IF, errore di sintassi, sintassi corretta da utilizzare vicino a ''
Quando provo e memorizzare la funzione utilizzando phpMyAdmin 3.4.9 (ultima versione stabile) ottengo il seguente errore:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 51
Inoltre ho installato l'ultima MySQL Workbench e ottengo lo stesso errore, ma anche che sia evidenziato un "Errore di sintassi SQL vicino a 'END'" quindi non è solo un bug in phpMyAdmin (anche se potrebbe essere un bug in phpMyAdmin e MySQL Workbench).
Ecco la query funzione di:
DELIMITER ;;
DROP FUNCTION IF EXISTS ADDRESS_BUILD;;
CREATE FUNCTION ADDRESS_BUILD(contact VARCHAR(50), company VARCHAR(100), add1 VARCHAR(255), add2 VARCHAR(255), add3 VARCHAR(255), town_city VARCHAR(50), county_state VARCHAR(50), postcode_zip VARCHAR(50), country VARCHAR(100), `separator` VARCHAR(10), type VARCHAR(10))
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE address TEXT;
DECLARE line TEXT;
IF LENGTH(TRIM(contact))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(contact)); END IF;
IF LENGTH(TRIM(company))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(company)); END IF;
IF LENGTH(TRIM(add1))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add1)); END IF;
IF LENGTH(TRIM(add2))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add2)); END IF;
IF LENGTH(TRIM(add3))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add3)); END IF;
IF country='United States of America' OR country='USA' OR country='Canada' OR country='CA' THEN
/* NORTH AMERICA, ALL ON 1 LINE */
IF LENGTH(TRIM(town_city))>0 THEN
IF type='mail' THEN SET line=CONCAT_WS('', TRIM(town_city), ' ');
ELSE SET line=CONCAT_WS('', line, TRIM(town_city), ', ');
END IF;
END IF;
IF LENGTH(TRIM(county_state))>0 THEN
IF type='mail' THEN SET line=CONCAT_WS('', line, TRIM(county_state), ' ');
ELSE SET line=CONCAT_WS('', line, TRIM(county_state), ' ');
END IF;
END IF;
IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF;
SET address=CONCAT_WS(`separator`, address, TRIM(line));
ELSE IF country='United Kingdom' OR country='UK' THEN
/* UK, ASCENDING LOCALITY SEPARATE LINES */
IF LENGTH(TRIM(town_city))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(town_city)); END IF;
IF LENGTH(TRIM(county_state))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(county_state)); END IF;
IF LENGTH(TRIM(postcode_zip))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(postcode_zip)); END IF;
ELSE
/* EUROPE EVERYWHERE ELSE, ALL ON 1 LINE POSTCODE FIRST */
IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF;
IF LENGTH(TRIM(town_city))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(town_city)); END IF;
IF LENGTH(TRIM(county_state))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(county_state)); END IF;
IF LENGTH(TRIM(line))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(line)); END IF;
END IF;
IF country='United States of America' THEN SET address=CONCAT_WS(`separator`, address, 'USA');
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(country));
END IF;
RETURN address;
END;;
Linea 51 è vicino alla fine se, clausole RETURN e fine, ma non riesco a individuare nulla di sbagliato in questo.
Qualcuno può vedere che cosa sta causando questo problema in MySQL Workbench e phpMyAdmin?
Una volta memorizzata la funzione, posso verificarla e modificare la logica.
Inoltre, se c'è qualcosa nella funzione che potrebbe essere semplificata, fatemelo sapere. Non ci sono molti esempi là fuori, quindi ho messo insieme un po 'questo.
No, ho paura :( – batfastad
@batfastad Che 'FINE SE;' forse non è l'unica cosa che manca ... ma non ho installato MySQL per verificarlo ... – Yahia
Abbastanza corretto, I Controlleremo rapidamente che i miei nidificazioni si abbinino. – batfastad