2015-10-17 2 views
0

Он я пытаюсь построить sql-запрос с несколькими вложенными запросами case.Sqlite inested case query

Моя таблица имеет следующие столбцы: ID, UserId, EventInTime, InTime, EventOutTime, OutTime.

Вот псевдо-код для столбца, который беспокоит меня:

(If EventInTime ==0 then IT = InTime else IT = EventInTime; 
If EventOutTime ==0 then IT = OutTime else OT = EventOutTime; 
If IT or OT ==0 then 0 else OT-IT) as Suma 

Heres мой код:

SELECT 
UserId, 
StatId, 
case when 
    case when EventInTime =0 
    then InTime 
    else EventInTime end=0 
    or 
     case when EventOutTime =0 
     then OutTime 
     else EventOutTime end 
     then 0 
else 
    case when EventOutTime =0 
    then OutTime 
    else EventOutTime end - 
     case when EventInTime =0 
     then InTime 
     else EventInTime end 
     as suma 
from Worktimes 

Что я делаю неправильно?

ответ

1

сравнение с нулем значения второго внутреннего корпуса отсутствует:

SELECT UserId, 
     StatId, 
     CASE 
     WHEN CASE EventInTime 
      WHEN 0 THEN InTime 
        ELSE EventInTime 
      END = 0 
      OR 
      CASE EventOutTime 
      WHEN 0 THEN OutTime 
        ELSE EventOutTime 
      END = 0     -- !!! 
     THEN 0 
     ELSE CASE EventOutTime 
      WHEN 0 THEN OutTime 
        ELSE EventOutTime 
      END 
      - 
      CASE EventInTime 
      WHEN 0 THEN InTime 
        ELSE EventInTime 
      END 
     END AS Suma 
FROM Worktimes; 

ИТ и ОТ равны нулю только тогда, когда оба столбца равны нулю, так что первые два внутренних МИОНы может быть упрощено:

SELECT UserId, 
     StatId, 
     CASE 
     WHEN (InTime = 0 AND EventInTime = 0) OR 
      (OutTime = 0 AND EventOutTime = 0) 
     THEN 0 
     ELSE CASE EventOutTime 
      WHEN 0 THEN OutTime 
        ELSE EventOutTime 
      END 
      - 
      CASE EventInTime 
      WHEN 0 THEN InTime 
        ELSE EventInTime 
      END 
     END AS Suma 
FROM Worktimes; 

Другой способ сделать запрос проще было бы ввести IT и OT как виртуальных колонок (это требует отдельного подзапрос):

SELECT UserId, 
     StatId, 
     CASE WHEN IT = 0 OR OT = 0 
      THEN 0 
      ELSE OT - IT 
     END AS Suma 
FROM (SELECT UserId, 
      StatId, 
      CASE EventInTime 
        WHEN 0 THEN InTime 
        ELSE EventInTime 
      END AS IT, 
      CASE EventOutTime 
        WHEN 0 THEN OutTime 
        ELSE EventOutTime 
      END AS OT 
     FROM Worktimes);