Adesso ho deciso di andare da un bravo psichiatra per farmi diagnosticare qualche problema a livello psichico di quelli complicati.
Allora, ho passato la mattinata per far digerire alla mia procedura ( o classe ) per l’utilizzo di più database anche sqlite;
E ora provo a passare in rassegna tutte le differenze tra MYSQL, POSTGRE, SQLITE che fino ad ora ho trovato.
Sicuro che non saranno tutte ma per lo meno ci provo.
Creazione di tabella da SELECT
Mysql : CREATE TABLE nometabella SELECT * FROM altratabella WHERE campo = ‘CONDIZIONE’
Postgre e Sqlite occorre aggiungere ‘AS’ quindi CREATE TABLE nometabella AS SELECT * FROM altratabella WHERE campo = ‘CONDIZIONE’
La nuova tabella avrà la struttura della vecchia.
Creazione di tabella temporanea da SELECT
Mysql : CREATE TEMPORARY TABLE nometabella SELECT * FROM altratabella WHERE campo = ‘CONDIZIONE’
Sqlite : CREATE TEMPORARY TABLE nometabella AS SELECT * FROM altratabella WHERE campo = ‘CONDIZIONE’ ( vedi clausola ‘AS’ )
Postgre CREATE OR REPLACE TEMP VIEW nometabella AS SELECT * FROM altratabella WHERE campo = ‘CONDIZIONE’ ( vedi clausola ‘AS’ )
La nuova tabella avrà la struttura della vecchia. Quando l’utente si disconnette da database, quindi passato il tempo di IDLE la tabella viene automaticamente eliminata. In Sqlite quando il file del db viene chiuso
Concatenare testo
Mysql e Postgre : SELECT campo1, campo2, concat(campo3,’ ‘,campo4,’ ', campo5) AS campocalcolato FROM … etc etc
Sqlite : si utilizza il doppio pipe ‘||’ quindi : SELECT campo1, campo2, (campo3 || ’ ’ || campo4 || ’ ’ || campo5) as campocalcolato FROM … etc etc
Condizioni nella query
Mysql e Postgre :
SELECT
CASE WHEN righe.causale = '001' THEN
1
ELSE
CASE WHEN righe.causale = '005' THEN
3
ELSE
2
END
END
as ordina, righe.causale FROM righe ORDER by ordina
Con Sqlite dovrebbe essere la stessa cosa;
Ordinare campi di testo contenente numeri :
Mysql - Sqlite utilizzare Cast() ad esempio : SELECT * FROM tabella ORDER by CAST(campo as decimal(10,3))
Postgre : Sembra non ci sia la possibilità di farlo se non creando un paio di funzioni :
CREATE FUNCTION f_ordnattxt(valore text) RETURNS text
LANGUAGE plpgsql IMMUTABLE
AS $$
DECLARE
testov TEXT;
BEGIN
testov := SUBSTRING(valore FROM '[^0-9]+');
RETURN testov;
END;
$$;
CREATE FUNCTION f_ordnatnum(valore text) RETURNS integer
LANGUAGE plpgsql IMMUTABLE
AS $$
DECLARE
testov TEXT;
numero INT;
BEGIN
testov := SUBSTRING(valore FROM '[0-9]+');
numero := coalesce(testov,'0')::int4;
RETURN numero;
END;
$$;
Utilizzo : SELECT campo1, campo2, campo3 FROM tabella ORDER BY f_ordnattxt(campo1),f_ordnatnum(campo1)
Dove campo1 è una campo testo che contiene anche numeri