LINUX.ORG.RU

SQL case

 


0

1

Postgresql 9.3.

	SELECT
		wo.id,
		valuefact2,
		wu.manualinput as workunit_manualinput,
		CASE WHEN wu.manualinput = TRUE THEN valuefact2 = 999
			ELSE valuefact2 = 77
		END
	FROM
		workunit wu,
		workotdel wo
	WHERE
		wo.workunit_id = wu.id  AND
		wo.otdel_id = ? AND
		wo.document_id = ?


Ругается «нет поля valuefact2». Его действительно нет, пробовал использовать CASE.
Если wu.manualinput = TRUE берем wo.valuefact
Если wu.manualinput = FALSE берем результат подзапроса:
      SELECT sum(wp.valuefact)
      FROM workpeople wp
      WHERE wp.workotdel_id = wo.id


Делать подзапрос через вызов функции на PL/pgSQL ?

Ты чего вообще хочешь? Если вернуть в valuefact2 77 или 999 то должно быть

SELECT
	wo.id,
	wu.manualinput as workunit_manualinput,
	CASE WHEN wu.manualinput = TRUE THEN 999
		ELSE 77
	END AS valuefact2
FROM
	workunit wu,
	workotdel wo
WHERE
	wo.workunit_id = wu.id  AND
	wo.otdel_id = ? AND
	wo.document_id = ?

monk ★★★★★ ()
Ответ на: комментарий от monk

Конечно глупость с моей стороны с valuefact2.
Для простых возвращаемых чисел все работает.

Реально нужно вычислять valuefact по условию, что и писал в теме:

CASE WHEN wu.manualinput = FALSE THEN
    SELECT sum(wp.valuefact)
    FROM workpeople wp
    WHERE wp.workotdel_id = wo.id
ELSE wo.valuefact END as valuefact2


Можно ли такое сделать или нужно функцию использовать?

WinLin2 ()
Последнее исправление: WinLin2 (всего исправлений: 3)
Ответ на: комментарий от WinLin2

Можно ли такое сделать

Можно, конечно. Если подзапрос напрямую не сработает, то можно так

SELECT
	wo.id,
	wu.manualinput as workunit_manualinput,
	CASE WHEN wu.manualinput = FALSE THEN
                wp_grp.valuefact
		ELSE wo.valuefact
	END AS valuefact2
FROM
	workunit wu,
	workotdel wo JOIN
        (SELECT sum(wp.valuefact) valuefact AS , workotdel_id
         FROM workpeople wp
         GROUP BY wp.workotdel_id) AS wp_grp 
        ON wo.id=wp_grp.workotdel_id
WHERE
	wo.workunit_id = wu.id  AND
	wo.otdel_id = ? AND
	wo.document_id = ?
monk ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.