Можете ли вы создать оператор case в команде select, который оценивает два разных поля таблицы? - PullRequest
2 голосов
/ 30 сентября 2010
SELECT HQRH_BADGENO,
       HQRH_SHIFT,
       HQBD_BADGENAME,
       HQRH_DISCRRECONCILE,
       HQRH_ADJUSTAMOUNT,
       HQRH_DISCRADJUSTMENT,
       CASE HQRH_DISCRRECONCILE
         WHEN 'HQRH_DISCRRECONCILE <0' THEN
          'HQRH_ADJUSTAMOUNT'
         WHEN 'HQRH_ADJUSTAMOUNT>0' THEN
          'HQRH_ADJUSTAMOUNT'
         WHEN 'HQRH_DISCRADJUSTMENT<0' THEN
          'HQRH_DISCRADJUSTMENT * (-1)'
         ELSE
          'HQRH_DISCRRECONCILE>0'
       END
  FROM HQ_CASHRECONCILEHEADER, HQ_BADGE
 WHERE HQ_CASHRECONCILEHEADER.HQRH_PLAZANO = HQ_BADGE.HQBD_PLAZANO
   and HQ_CASHRECONCILEHEADER.HQRH_BADGENO = HQ_BADGE.HQBD_BADGENO
   AND (HQ_CASHRECONCILEHEADER.HQRH_OPERATIONALDATE =
       TO_DATE(:dtstart, 'DD/MM/YYYY'))
   AND (HQ_CASHRECONCILEHEADER.HQRH_PLAZANO = :plazano)

Мне нужно применить условие case / if else к вышеуказанному оператору выбора.Я пытался, но я получаю ошибку.Это ошибка

ORA : 00923: from keyword not found where expected

На самом деле я хочу применить условие if-else, например:

if colA -ve then                             ' here colA = excess
    if colB +ve then paid = colB             ' here colB = paid
    elseif colC -ve then unpaid = colc * -1  ' here colC = unpaid
    else do nothing
else if colA +ve then excess = cola
else do nothing

Может кто-нибудь проверить мое заявление и дать какие-либо предложения?

Ответы [ 3 ]

6 голосов
/ 30 сентября 2010

Вот как я переписал ваш запрос:

SELECT crh.hqrh_badgeno,
       crh.hqrh_shift,
       b.hqbd_badgename,
       crh.hqrh_discrreconcile,
       crh.hqrh_adjustamount,
       crh.hqrh_discradjustment,
       CASE 
         WHEN crh.hqrh_discrreconcile < 0 THEN crh.hqrh_adjustamount
         WHEN crh.hqrh_adjustamount > 0 THEN crh.hqrh_adjustamount
         WHEN crh.hqrh_discradjustment < 0 THEN crh.hqrh_discradjustment * (-1)
         ELSE 0 --'HQRH_DISCRRECONCILE > 0' 
      END
 FROM HQ_CASHRECONCILEHEADER crh
 JOIN HQ_BADGE b ON b.hqbd_plazano = crh.hqrh_plazano
                AND b.hqbd_badgeno = crh.hqrh_badgeno
WHERE crh.hqrh_operationaldate = TO_DATE(:dtstart, 'DD/MM/YYYY')
  AND crh.hqrh_plazano = :plazano

Мне неясно, что должно произойти, если ни одно из предложений WHEN не совпадет.Выражение CASE должно всегда возвращать один и тот же тип данных, и все, что находится внутри одинарных кавычек, рассматривается как строка, но остальные значения представляются числовыми.Поэтому я жестко запрограммировал его, чтобы он возвращал ноль, и оставил предложение ELSE видимым в комментарии (не будет отображаться в выводе запроса).

2 голосов
/ 30 сентября 2010

Попробуйте это

SELECT HQRH_BADGENO,
   HQRH_SHIFT,
   HQBD_BADGENAME,
   HQRH_DISCRRECONCILE,
   HQRH_ADJUSTAMOUNT,
   HQRH_DISCRADJUSTMENT,
   CASE 
     WHEN HQRH_DISCRRECONCILE <0 THEN
      HQRH_ADJUSTAMOUNT
     WHEN HQRH_ADJUSTAMOUNT>0 THEN
      HQRH_ADJUSTAMOUNT
     WHEN HQRH_DISCRADJUSTMENT<0 THEN
      HQRH_DISCRADJUSTMENT * (-1)
   END 
  FROM HQ_CASHRECONCILEHEADER, HQ_BADGE
  WHERE HQ_CASHRECONCILEHEADER.HQRH_PLAZANO = HQ_BADGE.HQBD_PLAZANO
and HQ_CASHRECONCILEHEADER.HQRH_BADGENO = HQ_BADGE.HQBD_BADGENO
AND (HQ_CASHRECONCILEHEADER.HQRH_OPERATIONALDATE =
   TO_DATE(:dtstart, 'DD/MM/YYYY'))
AND (HQ_CASHRECONCILEHEADER.HQRH_PLAZANO = :plazano);

Если в противном случае произойдет сбой, регистр вернется к нулю, вы можете настроить это.Самая большая проблема состоит в том, что, как только вы предоставите кейс с параметром, он будет использовать его для сравнения в операторах when.В приведенном выше вы можете сравнить различные условия

0 голосов
/ 30 сентября 2010

Удаляйте одинарные кавычки из вашего запроса, когда вы используете оператор:

       CASE HQRH_DISCRRECONCILE
         WHEN HQRH_DISCRRECONCILE <0 THEN
          HQRH_ADJUSTAMOUNT
         WHEN HQRH_ADJUSTAMOUNT>0 THEN
          HQRH_ADJUSTAMOUNT
         WHEN HQRH_DISCRADJUSTMENT<0 THEN
          HQRH_DISCRADJUSTMENT * (-1)
         ELSE
          HQRH_DISCRRECONCILE>0
       END
...