在ibatis中使用oracle的sql语句,但是无法解析 case when ....end 语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"><sqlMap namespace="mapDataDay">
 <select id="showmapout" resultClass="java.util.HashMap">
 <![CDATA[
 select t.acct_month "acct_month",
  t.day_id "day_id",
  t.area_no "area_no",
  t3.mnemonic "mnemonic",
  t2.area_name "area_name",
  TO_CHAR(sum(t.pay_fee) / 10000,'FM999,999,999,990.0') "pay_fee",
  TO_CHAR(sum(t.pay_fee_hb) / 10000,'FM999,999,999,990.0') "pay_fee_hb",
  TO_CHAR(sum(t.pay_fee - t.pay_fee_hb) / 10000,'FM999,999,999,990.0') "zz",
  case when sum(t.pay_fee_hb)=0 then to_char(100) else
  TO_CHAR((sum(t.pay_fee - t.pay_fee_hb) / sum(t.pay_fee_hb)) * 100,
  'FM999,999,999,990.0') end "zz_bfb",
  '万元' "kpi_dw"
  from dm.dm_sett_call_portal_d t,
  dim.dim_area_code t2,
  dim.dim_area_mnemonic t3
 where t.acct_month = 201102
  and t.day_id = 01  and t.area_no = t2.area_code
  and t2.area_code = t3.area_no
  and t.pay_type in ('02', '05')
  and t.agent_no not like '0202%'
 group by t.area_no, t.acct_month, t2.area_name, t3.mnemonic,t.day_id,t.pay_fee_hb
 order by sum(t.pay_fee - t.pay_fee_hb) ]]>
 </select>

解决方案 »

  1.   

    先直接在oracle数据库里执行试试看行不行?把错误信息发出来来看看
      

  2.   

    这条sql语句没有问题,oracle中可以正确执行
      

  3.   


    --用decode()函数试试
    decode(sum(t.pay_fee_hb),
           0,to_char(100),
           to_char((sum(t.pay_fee - t.pay_fee_hb)/sum(t.pay_fee_hb))*100,'FM999,999,999,990.0'))
      

  4.   

    用decode不行,中午也遇到这个问题,
    select sba.BS_AGREEMENT_0025,sba.BS_AGREEMENT_0001,sba.BS_AGREEMENT_0007, 
      sum(case when sbf.BS_FEESTANDORD_ID =5  then  sbf.BS_FEE_0005 else 0 end),
      max(case when sbf.BS_FEESTANDORD_ID =5  then  sbf.BS_FEE_0001  end),
      sum(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0004 else 0 end),
      sum(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0005 else 0 end),
      max(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0001  end),
      sum(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0006 else 0 end),
      sum(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0004 else 0 end),
      sum(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0005 else 0 end),
      sum(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0006 else 0 end),
      max(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0001  end)
      from SCCBB_BS_FEE sbf,SCCBB_BS_AGREEMENT sba 
      where to_char(sba.BS_AGREEMENT_0007,'yyyy-MM')=to_char(#date#,'yyyy-MM') 
      and sbf.BS_AGREEMENT_ID = sba.BS_AGREEMENT_ID 
      and to_char(sbf.BS_FEE_0001,'yyyy-MM')=to_char(#date#,'yyyy-MM') 
      group by sba.BS_AGREEMENT_0025, sba.BS_AGREEMENT_0001, sba.BS_AGREEMENT_0007
    我把ibatis中生成的sql在sqldeveloper中运行,没有错误。但是在ibatis中运行报Cause: com.ibatis.common.beans.ProbeException: There is no WRITEABLE property named 'BS_FEESTANDORD_ID=5THENSBF' in class 'java.lang.Object'错误,这种错误类型是在做回调的时候JAVABEAN报错,也就是sum(case when sbf.BS_FEESTANDORD_ID =5  then  sbf.BS_FEE_0005 else 0 end)等不能作为一个bean的property,所以会报错。
    解决方法是加别名,英文的别名。
    select sba.BS_AGREEMENT_0025,sba.BS_AGREEMENT_0001,sba.BS_AGREEMENT_0007, 
      sum(case when sbf.BS_FEESTANDORD_ID =5  then  sbf.BS_FEE_0005 else 0 end) s1,
      max(case when sbf.BS_FEESTANDORD_ID =5  then  sbf.BS_FEE_0001  end) d1,
      sum(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0004 else 0 end) s21,
      sum(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0005 else 0 end) s22,
      max(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0001  end) d2,
      sum(case when sbf.BS_FEESTANDORD_ID =2  then  sbf.BS_FEE_0006 else 0 end) s23,
      sum(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0004 else 0 end) s31,
      sum(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0005 else 0 end) s32,
      sum(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0006 else 0 end) s33,
      max(case when sbf.BS_FEESTANDORD_ID =3  then  sbf.BS_FEE_0001  end) d3
      from SCCBB_BS_FEE sbf,SCCBB_BS_AGREEMENT sba 
      where to_char(sba.BS_AGREEMENT_0007,'yyyy-MM')=to_char(#date#,'yyyy-MM') 
      and sbf.BS_AGREEMENT_ID = sba.BS_AGREEMENT_ID 
      and to_char(sbf.BS_FEE_0001,'yyyy-MM')=to_char(#date#,'yyyy-MM') 
      group by sba.BS_AGREEMENT_0025, sba.BS_AGREEMENT_0001, sba.BS_AGREEMENT_0007
    这样就OK了。
    当resultClass是hashMap的时候往往忘记了JavaBean这个东西。