Оператор выбора case не работает в оракуле

У меня есть таблица Kpi_definition, в которой для конкретного event_id может присутствовать более одного KPI_DEF_ID. Например, для event_id = 10250 есть два KPI_DEF_ID. Я должен сначала проверить event_id, KPI_DEF_ID присутствует или нет, и если он отсутствует, тогда установите STATUS на 'N'. В другом условии я должен проверить, присутствует ли KPI_DEF_ID и нет ли значения поля KPI_ACTIVE_INITIAL,KPI_ACTIVE_CURRENT,KPI_ACTIVE_MANUAL,KPI_ACTIVE_DOWNTIME = 'N' для всех KPI_DEF_ID, затем OS.STATUS, иначе 'N'.

введите здесь описание изображения

Я написал приведенный ниже запрос выбора, но он не работает. Я пишу этот запрос внутри представления.

SELECT 'EVENT'     AS OBJECT_TYPE, 
       os.event_id AS OBJECT_ID, 
       CASE 
         WHEN NOT EXISTS(SELECT KD.kpi_def_id 
                         FROM   rator_monitoring_configuration.kpi_definition KD 
                         WHERE  KD.event_id = os.event_id 
                                AND KD.kpi_type IN ( 19, 21 )) THEN 'N' 
         WHEN EXISTS(SELECT KD.kpi_def_id 
                     FROM   rator_monitoring_configuration.kpi_definition KD 
                     WHERE  KD.event_id = os.event_id 
                            AND KD.kpi_type IN ( 19, 21 ) 
                            AND ( KD.kpi_active_initial = 'N' 
                                   OR KD.kpi_active_current = 'N' 
                                   OR KD.kpi_active_manual = 'N' 
                                   OR KD.kpi_active_downtime = 'N' )) THEN 'N' 
         ELSE os.status 
       END         AS OBJECT_STATUS 
FROM RATOR_MONITORING.EVENT_STATUS OS

person Andrew    schedule 03.09.2015    source источник
comment
Не работает как в вы получаете ошибку или не работает как в результате не то, что вы хотите?   -  person Mihai Ovidiu Drăgoi    schedule 03.09.2015
comment
Вам нужно создать два разных оператора case, а не один. Этот комментарий сделан для вас В другом состоянии   -  person SriniV    schedule 03.09.2015
comment
Я не получаю никаких ошибок, я не получаю результат, который хочу. @realspirituals не могли бы вы сказать мне, как я могу это сделать? Я не уверен, что без цикла это возможно?   -  person Andrew    schedule 03.09.2015
comment
Где ты FROM ? Вы обрезали свой запрос при копировании/вставке или забыли его в своем запросе?   -  person Fabienne B.    schedule 03.09.2015
comment
я отредактировал свой запрос.   -  person Andrew    schedule 03.09.2015
comment
@Rahul, покажите нам свой фактический результат и результат, который вы хотели получить, пожалуйста :-) или предоставьте нам SQLFiddle   -  person Fabienne B.    schedule 03.09.2015


Ответы (3)


select decode(kpi_def_id,NULL,'N',
       case when instr(ini||curr||downtime||manual,'N',1) = 0 
       then status else 'N' end)
from ex_6

привет Рахул,

этот запрос работал на моей машине. Удовлетворил ваше требование. Пожалуйста, отметьте ответ, если это поможет.

person Akshay Joshi    schedule 03.09.2015

Попробуйте использовать другой CASE в части ELSE. Напишите запрос, например:

SELECT 'EVENT'     AS OBJECT_TYPE, 
       os.event_id AS OBJECT_ID, 
       CASE 
         WHEN NOT EXISTS(SELECT KD.kpi_def_id 
                         FROM   rator_monitoring_configuration.kpi_definition KD 
                         WHERE  KD.event_id = os.event_id 
                                AND KD.kpi_type IN ( 19, 21 )) THEN 'N' 
         ELSE CASE WHEN EXISTS(SELECT KD.kpi_def_id 
                     FROM   rator_monitoring_configuration.kpi_definition KD 
                     WHERE  KD.event_id = os.event_id 
                            AND KD.kpi_type IN ( 19, 21 ) 
                            AND ( KD.kpi_active_initial = 'N' 
                                   OR KD.kpi_active_current = 'N' 
                                   OR KD.kpi_active_manual = 'N' 
                                   OR KD.kpi_active_downtime = 'N' )) THEN 'N' 
             ELSE os.status 
             END  
       END         AS OBJECT_STATUS 
FROM RATOR_MONITORING.EVENT_STATUS OS
person Sachin    schedule 03.09.2015
comment
ЛОЖЬ. вы можете использовать много when в case, это значение CASE - person Fabienne B.; 03.09.2015
comment
это не работает. Логика не верна. Я хочу сказать, если, например, для KPI_DEF_ID=1000356, если какое-либо из полей имеет значение N, а для KPI_DEF_ID = 1000389 любое из полей равно N, тогда установите статус «N». Другое условие относится к конкретному event_id и kpi_def_id, если все поля имеют значение «N», установите его на «N». Так что нам нужно больше случая, я думаю. Состояние дела неверное. Здесь он проверяет только первое условие для KPI_DEF_ID = 1000356 и возвращает результат N, который неверен. - person Andrew; 03.09.2015
comment
Если я вас прекрасно понимаю, просто отметьте if KPI_DEF_ID is present and none of the field value of KPI_ACTIVE_INITIAL = 'N' and KPI_ACTIVE_CURRENT = 'N' and KPI_ACTIVE_MANUAL = 'N' and KPI_ACTIVE_DOWNTIME = 'N' , затем os.status ELSE 'N', потому что все остальные условия будут выполнены в другой части.. - person Sachin; 03.09.2015

select case when decode(kpi_def_id,NULL,'N',col,0,'N') <> 'N' then status else 'N' end case from
(
 select kpi_def_id,instr(ini||curr||downtime||manual,'Y',1) col,ex_6.status status from ex_6
)

Этот запрос работает. Я объединил начальный, простой, текущий, ручной столбец и с помощью функции instr определил, есть ли в этой строке символ «Y», и использовал результат, возвращаемый внутренним запросом, во внешнем запросе, и с помощью функции декодирования мы можем достичь ожидаемого результата

С уважением,

person Akshay Joshi    schedule 03.09.2015
comment
это не работает. Логика не верна. Я хочу сказать, если, например, для KPI_DEF_ID=1000356, если какое-либо из полей имеет значение N, а для KPI_DEF_ID = 1000389 любое из полей равно N, тогда установите статус «N». Другое условие относится к конкретному event_id и kpi_def_id, если все поля имеют значение «N», установите его на «N». Так что нам нужно больше случая, я думаю. Состояние дела неверное. Здесь он проверяет только первое условие для KPI_DEF_ID = 1000356 и возвращает результат N, который неверен. - person Andrew; 03.09.2015
comment
я не использовал имя таблицы и имя столбца в качестве urs, но это дает желаемый результат. Я попытался выполнить его на своей машине, а затем опубликовал решение - person Akshay Joshi; 03.09.2015