2010-10-07 20 views
6

Bez korzystania z funkcji niestandardowych jest to możliwe w SQLite, aby wykonać następujące czynności. Mam dwie tabele, które są połączone za pomocą zwykłych numerów identyfikacyjnych. W drugiej tabeli występują dwie zmienne. Co chciałbym zrobić, to być w stanie zwrócić listę wyników, składającą się z: id rzędu i NULL, jeśli wszystkie wystąpienia tych dwóch zmiennych (i może być więcej niż dwa) są równe NULL, 1 jeśli wszystkie są 0 i 2, jeżeli jedna lub więcej to 1."if, then, else" w SQLite

Co mam teraz jest następujący:


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 

Więc co to wymaga się, aby przejść przez każdego wyniku w następujący sposób (szorstki Python Pseudokod):


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

Czy jest łatwiejszy sposób? Dzięki!

Odpowiedz

23

Użyj CASE...WHEN, np.

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

Więcej Od SQLite syntax manual (przejdź do sekcji "Wyrażenie case").

+0

Doskonale, dziękuję za to! –

1

Istnieje inny sposób na wartości numeryczne, który może być łatwiejszy w pewnych określonych przypadkach. Jest on oparty na tym, że wartość logiczną 1 lub 0, „jeśli stan” daje logiczną wynik:

(to będzie działać tylko za „lub” stan, w zależności od zużycia)

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

oczywiście odpowiedź @ evan jest ogólnym celem, poprawna odpowiedź.