【问题标题】:Oracle - String to Double - Dynamic ScaleOracle - String to Double - 动态缩放
【发布时间】:2018-02-24 13:47:53
【问题描述】:

我的情况是,在数据库内部,各种双精度值都存储为字符串。
(由于某些其他原因,无法更改!)

这些数字在小数点分隔符之后和之前可以有不同数量的数字。
存储值的小数分隔符.
数据库的默认小数分隔符将来可能会更改。

示例:

1.1  
111.1  
1.111  
11.11  
1.1111  

我现在需要选择这些作为数字,以便能够比较更大或更小的值等。

因此我尝试将字符串转换为数字。我在这个答案中找到了提示:click

不幸的是,将其用作测试:

SELECT TO_NUMBER('10.123', TRANSLATE('10.123', ' 1,234.567890', TO_CHAR(9999.9, '9G999D9') || '99999'))
FROM DUAL;

不知何故将数字转换为10123,完全删除了小数分隔,所以这个查询没有结果(只是为了验证):

SELECT * FROM(SELECT TO_NUMBER('10.123', TRANSLATE('10.123', ' 1,234.567890', TO_CHAR(9999.9, '9G999D9') || '99999')) AS NUM
FROM DUAL) WHERE NUM < 11;

所以我单步检查了单个部分,看看是否能找到错误:

SELECT TO_CHAR(9999.9, '9G999D9') FROM DUAL; -- 9.999,9

SELECT TO_CHAR(9999.9, '9G999D9') || '99999' FROM DUAL; -- 9.999,999999

SELECT TRANSLATE('10.123', ' 1,234.567890', ' 9.999,999999')
FROM DUAL; -- 99,999

SELECT TRANSLATE('10.123', ' 1,234.567890', TO_CHAR(9999.9, '9G999D9') || '99999')
FROM DUAL; -- 99,999

如您所见,我将. 作为组分隔符,将, 作为数据库的小数分隔符。


我不明白为什么它不能正确转换数字。
已经感谢您的帮助!

【问题讨论】:

  • 使用alter session set nls_numeric_characters='.,'; 重复您的测试,即将小数点分隔符设置为'.'

标签: sql oracle


【解决方案1】:

尝试使用 version 中的 to_number

TO_NUMBER( string1 [, format_mask] [, nls_language])

例如:

SELECT to_number('1.1111','9G990D00000', 'NLS_NUMERIC_CHARACTERS = ''.,''') FROM DUAL

【讨论】:

    【解决方案2】:

    你可以试试这个,

    alter session set NLS_NUMERIC_CHARACTERS = '.,';
    
    WITH INPUT_TEST AS (
        SELECT '.' decimal_operator, '1.1' num_in_char from dual
        UNION ALL
        SELECT '.' decimal_operator, '111.1  ' from dual
        UNION ALL
        SELECT '.' decimal_operator, '1.111 ' from dual
        UNION ALL
        SELECT '.' decimal_operator, '11.11  ' from dual
        UNION ALL
        SELECT '.' decimal_operator, '1.1111' from dual)
    SELECT TO_NUMBER(REPLACE(num_in_char, '.', decimal_separator)) to_num
      FROM input_test a, (select SUBSTR(value, 1, 1) decimal_separator 
                            from nls_session_parameters 
                           where parameter = 'NLS_NUMERIC_CHARACTERS') b;
    
        TO_NUM
    ----------
           1.1
         111.1
         1.111
         11.11
        1.1111
    
    alter session set NLS_NUMERIC_CHARACTERS = ',.';
    
    Run the select statement above again.
    
        TO_NUM
    ----------
           1,1
         111,1
         1,111
         11,11
        1,1111
    

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      相关资源
      最近更新 更多