#sql #oracle #case #user-defined-functions
#sql #Oracle #case #определяемые пользователем функции
Вопрос:
Я пытаюсь создать некоторые пользовательские формы в нашей 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, но приводит к тому, что приведенный ниже запрос выдает ошибку.
Кроме того, без преобразования В_CHAR в приведенной выше инструкции я получаю сообщение об ошибке «ORA-00932: несовместимые типы данных: ожидаемое ЧИСЛО получило символ», есть ли другой способ обойти это?
Последний запрос:
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
В конечном итоге я пытаюсь создать первое регистровое выражение для всех полей (G, H, I, J) во 2-м запросе.
Любая помощь с этим была бы высоко оценена.
Комментарии:
1. Выражения регистра!
Ответ №1:
Все ветви 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 возвращает строку.
Если вы хотите вернуть значение 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
Комментарии:
1. Спасибо, что разбили это для меня!