2010-10-07 10 views
6

Sans utiliser de fonctions personnalisées, est-il possible dans SQLite d'effectuer les opérations suivantes. J'ai deux tables, qui sont liées par des numéros d'identification communs. Dans la deuxième table, il y a deux variables. Ce que je voudrais faire est de pouvoir retourner une liste de résultats, composée de: l'identifiant de ligne, et NULL si toutes les instances de ces deux variables (et il peut y en avoir plus de deux) sont NULL, 1 si elles sont toutes 0 et 2 si un ou plusieurs est 1."if, then, else" dans SQLite

ce que j'est en ce moment comme suit:


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 

Alors, que cela demande est à l'étape par chaque résultat comme suit (pseudo-code Python brut):


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

Existe-t-il un moyen plus simple? Merci!

Répondre

23

Utilisez CASE...WHEN, par ex.

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

Lire la suite de SQLite syntax manual (passez à la section "L'expression CASE").

+0

Excellent, merci pour cela! –

1

Il existe une autre méthode, pour les valeurs numériques, qui peut être plus simple dans certains cas spécifiques. Il est basé sur le fait que les valeurs booléennes est 1 ou 0, « si la condition » donne un résultat booléen:

(ceci ne fonctionnera que pour « ou » état, dépend de l'utilisation)

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

bien sûr, la réponse de @ evan est la réponse générale, correcte