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条件应用于上面的select语句。 我试过但是我收到了一个错误。 那个错误是
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
任何人都可以查看我的陈述并提出任何建议吗?
答案 0 :(得分: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子句可见(不会出现在查询输出中)。
答案 1 :(得分: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语句。在上面,您可以比较不同的条件
答案 2 :(得分: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