2016-05-04 4 views
0

Я пытаюсь изменить оператор выбора SQL, чтобы выбрать обратное значение столбца (как, отрицательное, если значение было положительным, положительным, если значение было отрицательным) на основе значение другого столбца.Выявление столбца в операторе Oracle SQL CASE

Это (не обратное развитие) работы:

BSEG_WBTR as INVOICE_AMOUNT 

Но это не делает:

CASE 
    WHEN BSEG_SHKZG = 'S' THEN 
    -BSEG_WBTR 
    ELSE 
    BSEG_WBTR 
    END AS INVOICE_AMOUNT, 

Давать ошибку:

[Error] Execution (13: 45) : ORA-00904: «BSEG_WBTR»: недопустимый идентификатор

Что, по-видимому, означает, что BSEG_WBTR больше не отображается один раз внутри оператора CASE.

Как разоблачить столбец, который будет использоваться внутри оператора CASE?

+0

Вы уверены, что именно на это указывает ошибка? То, что вы написали, должно работать, неверно, что столбец выходит за пределы области действия в операторе CASE. Это точная часть запроса? (Я спрашиваю, потому что ошибка начинается с столбца 45, я не вижу ничего 45 символов в том, что вы написали). Какая строка, в частности, строка 13 в вашем коде? – mathguy

+0

@Allan Ваш новый SQL сделал трюк и работает. Если вы хотите воссоздать ответ, я бы с радостью принял его. –

+0

Является ли BSEG_WBTR псевдоним? Если это так, оно не будет доступно в выбранном статусе. Если нет, и он доступен на выбранном вами столе, вам нечего делать, чтобы разоблачить его внутри оператора case. – mo2

ответ

0

В нижеследующем приведенном ниже примере показаны три способа выполнения того, что вы пытаетесь выполнить. Мой предпочтительный синтаксис - второй (используйте имя столбца один раз, с case, предоставляющим множитель).

SELECT CASE WHEN bseg_shkzg = 'S' THEN -bseg_wbtr ELSE bseg_wbtr END 
      AS invoice_amount, 
     bseg_wbtr * CASE bseg_shkzg WHEN 'S' THEN -1 ELSE 1 END 
      AS invoice_amount2, 
     CASE WHEN bseg_shkzg = 'S' THEN 0 - bseg_wbtr ELSE bseg_wbtr END 
      AS invoice_amount3 
FROM (SELECT 10 AS bseg_wbtr, 'S' AS bseg_shkzg FROM DUAL 
     UNION ALL 
     SELECT 20 AS bseg_wbtr, 'R' AS bseg_shkzg FROM DUAL) 

Первый, кажется, что вы изначально пытались, так что я не уверен, что ошибка, которую вы видите непосредственно связана с ошибкой, вы получаете.

+0

Обновление SQL с помощью этого изменения не удаляет или не изменяет сообщение об ошибке. –

+0

Тогда, очевидно, ошибка должна быть в другом месте вашего кода, поскольку то, что опубликовал Allan, работает. (Просто скопируйте его и вставьте в свой SQL-интерфейс и запустите его - это доказывает, что ошибка НЕ ​​там, где вы думаете.) – mathguy

0

Чтобы выбрать обратное значение столбца (как и отрицательное, если значение положительное, положительное, если значение было отрицательным) в зависимости от значения другого столбца.

Умножьте любое значение с помощью -1, вернет обратное значение.

Пример:

DECLARE @BSEG_SHKZG AS INT = 2; 
SELECT @BSEG_SHKZG * -1 -- results -2 

DECLARE @BSEG_SHKZG_ AS INT = -2; 
SELECT @BSEG_SHKZG_ * -1 -- results 2 

Так ниже запрос вернет ваш ожидаемый результат:

CASE 
WHEN BSEG_SHKZG = 'S' THEN 
    BSEG_WBTR * -1 
ELSE 
    BSEG_WBTR 
END AS INVOICE_AMOUNT 
+1

Но ПОЧЕМУ? -BSEG_WBTR должно быть одного и того же значения, почему бы * -1 работать, когда унарный оператор терпит неудачу? – mathguy

1

Просто умножить значение на -1. Попробуйте следующее:

CASE 
    WHEN BSEG_SHKZG = 'S' THEN 
    BSEG_WBTR * -1 
    ELSE 
    BSEG_WBTR 
    END AS INVOICE_AMOUNT, 
+2

Но ПОЧЕМУ? -BSEG_WBTR должно быть одного и того же значения, почему бы * -1 работать, когда унарный оператор терпит неудачу? – mathguy

+0

Вы правы. Они оба должны работать. Я неправильно понял вопрос - похоже, что у него есть какая-то ошибка, вызванная неопубликованным кодом. –

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