Объединение выражений SQL CASE в пользовательской форме

#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. Спасибо, что разбили это для меня!