2
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)

上記の select ステートメントに 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

誰でも私の声明を確認して、何か提案をしてもらえますか?

4

3 に答える 3

6

これは私があなたのクエリを書き直した方法です:

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 句をコメントに表示したままにしました (クエリ出力には表示されません)。

于 2010-09-30T04:47:56.353 に答える
2

これを試して

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);

他のすべてが失敗した場合、ケースは null を返します。これは調整できます。最大の問題は、case にパラメーターを指定すると、それを使用して when ステートメントで比較されることです。上記では、さまざまな条件を比較できます

于 2010-09-30T05:19:02.680 に答える
0

ケース ステートメントを使用する場合は、クエリから一重引用符を削除します。

       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
于 2010-09-30T04:26:42.583 に答える