2012-11-06 16 views
9

sto cercando di evitare di scrivere diverse query SQL per ottenere il seguente scenario:Sqlite - Selezionare o Inserisci e selezionare in una statment

Ho una tabella chiamata Valori:

Valori:

id INT (PK) 
data TEXT 

Vorrei verificare se esiste un dato nella tabella, se è di ritorno è id, se non esiste, quindi inserirlo e restituire il suo id.

Il (molto) modo semplice sarebbe:

select id from Values where data = "SOME_DATA"; 

se id non è nullo, grande uso esso. se id è nullo allora:

insert into Values(data) values("SOME_DATA"); 

e quindi selezionare di nuovo per vedere la sua id o utilizzare l'id restituito.

Sto cercando di rendere la funzionalità di cui sopra in una riga. Credo di essere sempre vicino, ma non ho potuto farlo ancora: Finora ho ottenuto questo:

select id from Values where data=(COALESCE((select data from Values where data="SOME_DATA"), (insert into Values(data) values("SOME_DATA")); 

sto cercando di approfittare del fatto che il secondo di selezione torneranno nullo e quindi verrà restituito il secondo argomento a COALESCE. Nessun successo finora. Cosa mi manca?

Promemoria, questo è un motore sqlite3! : P

Grazie!

+0

Perché il tag MySQL? –

+0

Ci sono molte somiglianze, forse la risposta verrà dal thread MySQL: P – user1782427

+0

Il comportamento che si desidera è specifico del fornitore. Alcuni fornitori forniscono un modo per restituire i valori inseriti/eliminati dai comandi di inserimento/aggiornamento. Ad esempio, in SQL Server è possibile generare un nuovo ID utilizzando la clausola OUTPUT senza bloccare, mentre MySQL ha il LAST_INSERT_ID per restituire l'ultimo ID auto-generato –

risposta

9

Il comando non funziona perché in SQL, INSERT non restituisce un valore.

Se si dispone di un vincolo/indice univoco sulla colonna data, è possibile utilizzarlo per evitare duplicati se si inserisce ciecamente il valore; questo utilizza SQLite's INSERT OR IGNORE extension:

INSERT OR IGNORE INTO "Values"(data) VALUES('SOME_DATE'); 
SELECT id FROM "Values" WHERE data = 'SOME_DATA'; 
+0

, quindi si consiglia di inserire comunque (il caso peggiore verrà ignorato) e quindi selezionare. Stavo cercando di farlo in una sola nave, ma non sembrava funzionare. Grazie! – user1782427

Problemi correlati