比较2个不同精度和比例的数字

时间:2016-10-14 11:54:24

标签: sql oracle

我正在编写一个条件,检查两列数据类型编号。

例如varchar2(100)大于varchar2(50),因为它包含更多字符。现在对于数字,数字(9,1)大于数字(10,3),因为它包含更多的数字?

在下面的示例中,F_IDnumber(10,3),我想与另一列number(9,3)进行比较

DECLARE COL_COUNT NUMBER;
OLD_PREC NUMBER(5);
OLD_SCALE NUMBER(5);
BEGIN
SELECT DATA_PRECISION, DATA_SCALE INTO OLD_PREC,OLD_SCALE FROM USER_TAB_COLS
WHERE TABLE_NAME='EX_EMPLOYEE' AND COLUMN_NAME='F_ID';
IF ( OLD_PREC <= 9 AND OLD_SCALE < 3 ) THEN
-- do something

我可以像这样比较吗?因为(9,1) = 12345678,1(10,3) = 123456,1234,所以基本上9,1大于10,3对吗?

3 个答案:

答案 0 :(得分:0)

Oracle以科学记数法存储数字:http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1833因此,小数精度与存储数字所需的空间之间没有直接关系。

如果你想检查哪一个会占用更多空间作为文字,为什么不比较length(to_char(n1)) > length(to_char(n2))

答案 1 :(得分:0)

column_name NUMBER (precision, scale) 

在上面的声明中,精度是总位数,而刻度是小数点右边的位数。

通过从精度中减去比例,您将找到小数点左边的数字。

因此, NUMBER (9,1) could contain maximum 8 length number left of the decimal point : 9999,9999.9NUMBER (10,3) could contain maximum 7 length number left of the decimal point : 999,9999.999

考虑到这一点,你可以说第一列更大。

请注意,如果小数点右边的数字为equal,则必须检查scale

NUMBER (8,1) could contain maximum 7 length number left of the decimal point: 999,9999.9NUMBER (10,3) could contain maximum 7 length number left of the decimal point : 999,9999.999 但在这种情况下,第二列较大,因为它有3个长度scale

答案 2 :(得分:0)

你说:

  

“varchar2(100)大于varchar2(50)对吗?它更多   性格。好吧现在对于数字,数字(9,1)比那更大   数字(10,3)“

作为一个infrence我只能得到你想要比较数据类型。请参阅下文,了解如何做到这一点。我使用PLSQL匿名块来解释。

declare
   a   number (9, 1);
   b   number (10, 3);
begin
   if length (a) > length (b)
   then
      dbms_output.put_line ('a is bigger');
   else
      dbms_output.put_line ('a is smaller');
   end if;
end;

输出:

SQL> /
a is smaller

PL/SQL procedure successfully completed.