我正在使用Oracle,并且我需要在需要TO_CHAR()
的地方执行一些数学计算。
但它并不是在比较这些值。
下面是示例。
IF TO_CHAR(V_APP_FAIR_RENT, '99,9999') > TO_CHAR(v_ACT_RENTAMT, '99,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条件下。
请指出我哪里错了。
发布于 2021-05-11 02:41:05
如果您所说的原始列是字符串(为什么?),并且您的示例似乎不包括组或小数字符,那么为什么不使用具有默认格式的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;
发布于 2021-05-11 02:03:21
正如@pmdba所说,为什么要转换已经是数字的内容(是吗?),以进行比较?
如果执行查询:
select TO_CHAR(7455 , '99,9999'), TO_CHAR(10928, '99,9999') from dual
结果是字符串:"7455“"1,0928”。
一个有千位分隔符,另一个没有。因此,您不是在比较数值,在这种情况下,字符串表示将不适用于比较。
如果您仍然坚持转换,则需要删除逗号分隔符:
select TO_CHAR(7455 , '999999'), TO_CHAR(10928, '999999') from dual
也许你可以编辑你的问题,显示这些变量是如何定义的,以确定你试图实现的目标。
https://stackoverflow.com/questions/67479041
复制