问题描述
我正在使用 Oracle,我需要在需要 TO_CHAR()
的地方执行一些数学计算。
但这不是比较值。
这是下面的示例。
IF TO_CHAR(V_APP_FAIR_RENT,'99,9999') > TO_CHAR(v_ACT_RENTAMT,9999')
THEN
V_HIGHER_RENT_PREMIUM := 0;
dbms_output.put_line('Higher Rental premium 0 :' || V_HIGHER_RENT_PREMIUM);
ELSE
V_HIGHER_RENT_PREMIUM := v_ACT_RENTAMT / V_AMTINMONTH;
V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM * V_NOOFDAYSINMONTH;
V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM - V_APP_FAIR_RENT;
V_HIGHER_RENT_PREMIUM := ROUND(V_HIGHER_RENT_PREMIUM / V_NOOFOPCO);
dbms_output.put_line('Higher rental premium 1 :' || V_HIGHER_RENT_PREMIUM);
END IF;
两个比较的值如下。
V_APP_FAIR_RENT
= 7455
和 v_ACT_RENTAMT
= 10928
从技术上看,上面的比较应该在 IF 条件下,但实际上它在 ELSE 条件下。
请指出我哪里出错了。
解决方法
如果如您所说的原始列是字符串(为什么?),并且您的示例似乎不包含组字符或小数字符,那么为什么不使用具有默认格式的 to_number 来比较数值?
IF to_number(V_APP_FAIR_RENT) > to_number(V_ACT_RENTAMT)
THEN
V_HIGHER_RENT_PREMIUM := 0;
dbms_output.put_line('Higher Rental premium 0 :' || V_HIGHER_RENT_PREMIUM);
ELSE
V_HIGHER_RENT_PREMIUM := v_ACT_RENTAMT / V_AMTINMONTH;
V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM * V_NOOFDAYSINMONTH;
V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM - V_APP_FAIR_RENT;
V_HIGHER_RENT_PREMIUM := ROUND(V_HIGHER_RENT_PREMIUM / V_NOOFOPCO);
dbms_output.put_line('Higher rental premium 1 :' || V_HIGHER_RENT_PREMIUM);
END IF;
,
正如@pmdba 所说,你为什么要转换已经是数字的东西(是吗?),以进行比较?
如果您执行查询:
select TO_CHAR(7455,'99,9999'),TO_CHAR(10928,9999') from dual
结果是字符串:“7455”“1,0928”。
一个有千位分隔符,另一个没有。所以你不是在比较数值,在这种情况下,字符串表示不能用于比较。
如果你仍然一心想转换,你需要去掉逗号分隔符:
select TO_CHAR(7455,'999999'),'999999') from dual
也许您可以编辑您的问题以显示如何定义这些变量以确定您要完成的任务。