«если, тогда, еще» в SQLite - PullRequest
6 голосов
/ 07 октября 2010

Без использования пользовательских функций возможно ли в SQLite сделать следующее.У меня есть две таблицы, которые связаны через общие номера идентификаторов.Во второй таблице есть две переменные.То, что я хотел бы сделать, это иметь возможность возвращать список результатов, состоящий из: идентификатора строки и NULL, если все экземпляры этих двух переменных (и их может быть больше двух) равны NULL, 1, если все они равны 0и 2, если один или несколько равен 1.

То, что у меня сейчас есть, выглядит следующим образом:


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

Итак, для этого требуется пошагово просмотреть каждый результат следующим образом (грубый псевдокод Python):


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

Есть ли более простой способ?Спасибо!

Ответы [ 2 ]

23 голосов
/ 07 октября 2010

Используйте CASE...WHEN, например,

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

Подробнее из Руководство по синтаксису SQLite (см. Раздел «Выражение CASE»).

1 голос
/ 29 декабря 2013

Есть другой способ для числовых значений, который может быть проще для определенных конкретных случаев.Он основан на том факте, что логические значения равны 1 или 0, «если условие» дает логический результат:

(это будет работать только для условия «или», зависит от использования)

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

конечно, ответ Эвана является универсальным, правильным ответом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...