2015-08-10 3 views
0

Итак, у меня есть аргумент case, который я пытаюсь выяснить, и в конечном итоге я не думаю, что мне нужно сделать это как случай, но я попытался сделать это как подзапрос внутри оператора select, и это не сработало.Oracle SQL Выберите IF/Then/Case в результаты столбца

SELECT ID.ID_VALUE AS ID, 

(CASE WHEN OBJ.STATUSCD = 'TEST' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) 
    AS TEST_DATE, 
(CASE WHEN OBJ.STATUSCD = 'NON-T' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) 
    AS NON-T_DATE 

Когда я обрабатываю это, я получаю результат, содержащий 3 столбца и 2 строки. Одна строка содержит значение TEST_DATE в одном столбце и ничего в другом. Затем в другой строке у меня есть значение в NON-T_DATE и ничего в другой ячейке. Значения ID одинаковы, поэтому я не знаю, почему я не могу получить результаты в одной строке без дубликатов.

Вот пример моих результатов:

 || ID || TEST_DATE || NON-T_DATE || 
    || 10 || 1/1/2015 ||  NULL  || 
    || 10 || NULL  || 1/2/2015 || 

ответ

0

Потому что это отдельный оператор Case. Единственный способ получить их одним выстрелом - запустить еще один проход, где этот результирующий набор является производной таблицей и распечатает это.

select ID_VALUE, TEST_DATE, NON-T_DATE from 
(SELECT ID.ID_VALUE AS ID, 

(CASE WHEN OBJ.STATUSCD = 'TEST' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) 
    AS TEST_DATE, 
(CASE WHEN OBJ.STATUSCD = 'NON-T' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) 
    AS NON-T_DATE) derivedtable 
0

Вы должны переписать запрос, как указано ниже

SELECT ID.ID_VALUE AS ID, 
(CASE WHEN OBJ.STATUSCD = 'TEST' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') 
WHEN OBJ.STATUSCD = 'NON-T' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) 
    AS NON-T_DATE 
FROM TABLE_NAME 
1

Использование group by и функции агрегации:

SELECT ID.ID_VALUE AS ID, 
     MAX(CASE WHEN OBJ.STATUSCD = 'TEST' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) AS TEST_DATE, 
     MAX (CASE WHEN OBJ.STATUSCD = 'NON-T' THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') END) AS NON-T_DATE 
FROM . . . 
GROUP BY ID.ID_VALUE; 
0

Похоже, что вы либо хотите pivot данные или использовать старые max(case подход

SELECT ID.ID_VALUE AS ID, 
     MAX(CASE WHEN OBJ.STATUSCD = 'TEST' 
       THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') 
       ELSE NULL 
      END) AS TEST_DATE, 
     MAX(CASE WHEN OBJ.STATUSCD = 'NON-T' 
       THEN TO_CHAR(OBJ.DTTM,'MM/DD/YYYY') 
       ELSE NULL 
      END) AS NON-T_DATE 
    FROM <<something>> 
GROUP BY id.id_value 

Дополнительные статьи ELSE не требуются. Но я предпочел бы быть явным, а не надеяться, что следующий человек, прочитавший этот код, помнит, что оператор CASE возвращает NULL, если совпадений нет, а MAX будет выбирать значение, отличное от NULL, из набора.

Смежные вопросы