В настоящее время у меня есть оператор CASE, который проверяет, завершены ли определенные задачи или нет, а затем возвращает дату следующей задачи. Поскольку задачи упорядочены, каждый оператор WHEN становится длиннее, проверяя каждую из предыдущих задач, чтобы проверить, завершены ли они. По какой-то причине после первого WHEN-заявления он пропускает прямо к ELSE (он должен соответствовать условиям второго или третьего КОГДА).SQL CASE, проверяющий два условия из того же столбца
CASE
WHEN T.PRNAME = 'TECH PEP MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TECH PEP MEETING DATE' AND PRISMILESTONE = 1)
WHEN (T.PRNAME = 'TECH PEP MEETING DATE' AND T.PRSTATUS = 2) AND (T.PRNAME = 'BRU MEETING DATE' AND T.PRSTATUS != 2) THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'BRU MEETING DATE' AND PRISMILESTONE = 1)
WHEN (T.PRNAME = 'TECH PEP MEETING DATE' AND T.PRSTATUS = 2) AND (T.PRNAME = 'BRU MEETING DATE' AND T.PRSTATUS = 2) AND (T.PRNAME = 'TSC MEETING DATE' AND T.PRSTATUS != 2) THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TSC MEETING DATE' AND PRISMILESTONE = 1)
ELSE (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'END OF EVALUATE PHASE' AND PRISMILESTONE = 1)
END
Есть ли какой-либо конкретный способ, с помощью которого вам необходимо обращаться к этим типам нескольких условий КОГДА?
EDIT: Итак, после некоторых отзывов от вас, ребята, я согласен с тем, что вам нужно всего лишь оценить одну задачу за КОГДА, потому что оператор CASE должен выйти, как только он найдет свой первый TRUE-оператор. Тем не менее, обновив его:
CASE
WHEN UPPER(T.PRNAME) = 'EVALUATE TECH PEP MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TECH PEP MEETING DATE' AND PRISMILESTONE = 1 AND ROWNUM = 1)
WHEN UPPER(T.PRNAME) = 'EVALUATE BRU MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'BRU MEETING DATE' AND PRISMILESTONE = 1 AND ROWNUM = 1)
WHEN UPPER(T.PRNAME) = 'EVALUATE TSC MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TSC MEETING DATE' AND PRISMILESTONE = 1 AND ROWNUM = 1)
ELSE (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'END OF EVALUATE PHASE' AND PRISMILESTONE = 1)
END
Я теперь получаю:
ORA-01427: single-row subquery returns more than one row
Не знаю, почему это так, особенно надев ROWNUM = 1
на конце, чтобы обеспечить только один результат возвращается.
При выполнении ТО само по себе:
SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY')
FROM PRTASK T
WHERE T.PRPROJECTID = INV_INVESTMENTS.ID
AND Upper(T.PRNAME) = 'TECH PEP MEETING DATE'
AND PRISMILESTONE = 1
AND ROWNUM = 1
Я получаю один результат. Если я прав, считая, что оператор CASE выйдет, как только он найдет свой первый TRUE-оператор, почему это находит несколько строк?
EDIT 2: Хорошо, поэтому я еще немного поиграл с этим (потому что я до сих пор не могу найти логический ответ, и я немного продвинулся вперед. Теперь я изменил способ структурирования запроса следующий:.
SELECT DISTINCT To_Char(T.PRFINISH, 'DD/MM/YY'),
T.PRNAME
FROM PRTASK T
LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID
WHERE T.PRNAME = CASE
WHEN (T.PRNAME = 'Concept Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Concept BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept BRU Meeting Date'
WHEN (T.PRNAME = 'End of Concept Phase' AND T.PRSTATUS != 2) THEN 'End of Concept Phase'
WHEN (T.PRNAME = 'Evaluate Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Evaluate BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate BRU Meeting Date'
WHEN (T.PRNAME = 'Evaluate TSC Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate TSC Meeting Date'
WHEN (T.PRNAME = 'End of Evaluate Phase' AND T.PRSTATUS != 2) THEN 'End of Evaluate Phase'
WHEN (T.PRNAME = 'End of Analyse Phase' AND T.PRSTATUS != 2) THEN 'End of Analyse Phase'
WHEN (T.PRNAME = 'End of Design Phase' AND T.PRSTATUS != 2) THEN 'End of Design Phase'
WHEN (T.PRNAME = 'End of Build Phase' AND T.PRSTATUS != 2) THEN 'End of Build Phase'
WHEN (T.PRNAME = 'End of Test Phase' AND T.PRSTATUS != 2) THEN 'End of Test Phase'
WHEN (T.PRNAME = 'In Service' AND T.PRSTATUS != 2) THEN 'In Service'
WHEN (T.PRNAME = 'End of Implement Phase' AND T.PRSTATUS != 2) THEN 'End of Implement Phase'
WHEN (T.PRNAME = 'End of Closure Phase' AND T.PRSTATUS != 2) THEN 'End of Closure Phase'
ELSE 'In Service'
END
AND INV_INVESTMENTS.CODE = '007058'
Теперь, однако, я получаю множественный КОГДА заявления возвращения значения Может кто-нибудь подтвердить, действительно ли или нет заявление СЛУЧАЯ возвращает только первый ИСТИНУ значения
Вы должны использовать или инструкцию вместо И во втором и третьем случаях. например (T.PRNAME = «ТЕХНИЧЕСКАЯ ЗАСЕДАНИЯ PEP» и T.PRSTATUS = 2) AND (T.PRNAME = 'BRU MEETING DATE' и T.PRSTATUS! = 2) должны быть написаны следующим образом (T.PRNAME = 'TECH PEP MEETING DATE' И T.PRSTATUS = 2) ИЛИ (T.PRNAME = 'BRU MEETING DATE' AND T.PRSTATUS! = 2) –
@Matthew основывается на вашей ошибке, проблема заключается в вашем запросе 'SELECT', он возвращает более 1 строки/записи, попробуйте проверить инструкцию' SELECT' speciailly на 'WHERE' состоянии если почему он возвращает более 1 строки. – Japongskie
@Matthew вы попробовали 3-й 'WHEN', там также есть инструкция SELECT TO_CHAR (MAX (T.PRFINISH), 'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper (T.PRNAME) = 'TSC MEETING DATE' И PRISMILESTONE = 1 И ROWNUM = 1', любезно попробуйте, если также вернет 1 запись. – Japongskie