2010-10-07 14 views
6

Senza l'utilizzo di funzioni personalizzate, è possibile eseguire in SQLite quanto segue. Ho due tabelle, che sono collegate tramite numeri di identificazione comuni. Nella seconda tabella ci sono due variabili. Quello che mi piacerebbe fare è essere in grado di restituire un elenco di risultati, composto da: id di riga e NULL se tutte le istanze di queste due variabili (e potrebbero essercene più di due) sono NULL, 1 se sono tutte 0 e 2 se uno o più è 1."if, then, else" in SQLite

quello che ho in questo momento è la seguente:


SELECT 
    a.aid, 
    (SELECT count(*) from W3S19 b WHERE a.aid=b.aid) as num, 
    (SELECT count(*) FROM W3S19 c WHERE a.aid=c.aid AND H110 IS NULL AND H112 IS NULL) as num_null, 
    (SELECT count(*) FROM W3S19 d WHERE a.aid=d.aid AND (H110=1 or H112=1)) AS num_yes 
FROM W3 a 

Così che cosa questo richiede è fare un passo attraverso ogni risultato come segue (approssimativa Python pseudocodice):


if row['num_yes'] > 0: 
    out[aid] = 2 
elif row['num_null'] == row['num']: 
    out[aid] = 'NULL' 
else: 
    out[aid] = 1 

C'è un modo più semplice? Grazie!

risposta

23

Utilizzare CASE...WHEN, ad es.

CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END 

Leggi tutto da SQLite syntax manual (vai alla sezione "L'espressione CASE").

+0

Eccellente, grazie per questo! –

1

C'è un altro modo, per i valori numerici, che potrebbe essere più semplice per alcuni casi specifici. Si basa sul fatto che i valori booleani è 1 o 0, "se la condizione" dà un risultato booleano:

(questo funziona solo per "o" condizione, dipende dall'uso)

SELECT (w1=TRUE)*r1 + (w2=TRUE)*r2 + ... 

naturalmente la risposta @ evan è la risposta generale, corretta,