Объединение выражений SQL CASE в определяемой пользователем форме - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь создать некоторые пользовательские формы в нашей системе ERP с базой данных Oracle.Я столкнулся с проблемой, когда запрос нижнего уровня не может получить из поля верхнего уровня, так как это поле заполняется из запроса.

Мой вопрос здесь;Можно ли объединить эти два оператора?

Первый запрос:

SELECT
CASE WHEN VV = 'Y' AND V11 IS NULL OR V11 = 'N' THEN TO_CHAR(V, '999,999,999.00')
WHEN V11 = 'Y' AND VV IS NULL OR VV = 'N' THEN TO_CHAR(V1, '999,999,999.00')
ELSE ' '
END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID

Этот запрос извлекает правильные данные и передает поле G, но вызывает приведенный ниже запрос к ошибке.

Кроме того, без преобразования TO_CHAR в приведенном выше операторе я получаю сообщение об ошибке «ORA-00932: несовместимые типы данных: ожидается, что NUMBER получил CHAR». Есть ли другой способ решения этой проблемы?

Последний запрос:

SELECT 
CASE WHEN E = 0 THEN 1 
ELSE ROUND(((G+H+I) / J),2)
END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID

Я пробовал это, но получаю ошибку "ORA-00905: отсутствует ключевое слово"

SELECT 
CASE WHEN E = 0 THEN 1 
ELSE CASE WHEN VV = 'Y' AND V11 IS NULL OR V11 = 'N' THEN TO_CHAR(((V+H+I)/J), '999,999,999.00')
WHEN V11 = 'Y' AND VV IS NULL OR VV = 'N' THEN TO_CHAR(((V1+H+I)/J), '999,999,999.00')
END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID

В конечном итоге я пытаюсь создать первое выражение CASE для всех полей (G, H, Я, J) во 2-м запросе.

Любая помощь с этим будет принята с благодарностью.

1 Ответ

2 голосов
/ 22 марта 2019

Все ветви оператора case должны возвращать один и тот же тип данных.
Итак, в этом:

SELECT
CASE WHEN VV = 'Y' AND V11 IS NULL OR V11 = 'N' THEN TO_CHAR(V, '999,999,999.00')
WHEN V11 = 'Y' AND VV IS NULL OR VV = 'N' THEN TO_CHAR(V1, '999,999,999.00')
ELSE ' '
END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID

если вы удалите TO_CHAR, вы получите ошибку, потому что ELSE branch возвращает строку.
Если вы хотите вернуть 0 вместо ' ', вы можете сделать это:

SELECT
CASE WHEN VV = 'Y' AND V11 IS NULL OR V11 = 'N' THEN V
WHEN V11 = 'Y' AND VV IS NULL OR VV = 'N' THEN V1
ELSE 0
END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID

В последнем из ваших запросов:

SELECT 
CASE 
  WHEN E = 0 THEN 1 
  ELSE 
    CASE 
      WHEN VV = 'Y' AND V11 IS NULL OR V11 = 'N' THEN TO_CHAR(((V+H+I)/J), '999,999,999.00')
      WHEN V11 = 'Y' AND VV IS NULL OR VV = 'N' THEN TO_CHAR(((V1+H+I)/J), '999,999,999.00')
    END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID

у вас есть вложенное case внутри другого case, и вы забыли последнее end.
Также возвращаемые типы данных отличаются от двух ветвей.
Может быть изменить на это:

SELECT 
  CASE 
    WHEN E = 0 THEN 1 
    ELSE 
      CASE 
        WHEN VV = 'Y' AND V11 IS NULL OR V11 = 'N' THEN (V+H+I)/J
        WHEN V11 = 'Y' AND VV IS NULL OR VV = 'N' THEN (V1+H+I)/J
      END
  END
FROM V_UD_TOOL_RFQ 
WHERE PARENT_ID = :ID  
...