TO_NUMBER,指定查询中的小数点分隔符

时间:2019-03-19 16:41:14

标签: oracle11g

您可以在查询中使用TO_NUMBER函数指定小数点分隔符。无需更改会话或在系统中配置参数。

SELECT TO_NUMBER('-AusDollars100','L9G999D99',
                ' NLS_NUMERIC_CHARACTERS = '',.''
                  NLS_CURRENCY            = ''AusDollars''
                ') "Amount"
 FROM DUAL;

尝试这种方式,但不起作用

可以解决吗?

1 个答案:

答案 0 :(得分:0)

顾名思义,to_number()函数返回数字数据类型。客户应如何显示该内容;这就是alter session会影响该输出的原因。

无论会话设置如何,您的原始查询都会生成相同的数字:

alter session set NLS_NUMERIC_CHARACTERS = ',.';

SELECT TO_NUMBER('-AusDollars1.234,56','L9G999D99',
                ' NLS_NUMERIC_CHARACTERS = '',.''
                  NLS_CURRENCY            = ''AusDollars''
                ') "Amount"
 FROM DUAL;

    Amount
----------
  -1234,56

alter session set NLS_NUMERIC_CHARACTERS = '.,';

SELECT TO_NUMBER('-AusDollars1.234,56','L9G999D99',
                ' NLS_NUMERIC_CHARACTERS = '',.''
                  NLS_CURRENCY            = ''AusDollars''
                ') "Amount"
 FROM DUAL;

    Amount
----------
  -1234.56

客户端以不同的方式显示这些数字,但是会话设置不会影响实际查询的工作方式。

如果要控制显示而不改变会话,则可以将结果显式格式化为字符串:

alter session set NLS_NUMERIC_CHARACTERS = ',.';

SELECT TO_CHAR(TO_NUMBER('-AusDollars1.234,56','L9G999D99',
                        ' NLS_NUMERIC_CHARACTERS = '',.''
                          NLS_CURRENCY            = ''AusDollars''
                        '),'9999D99',
                'NLS_NUMERIC_CHARACTERS = ''.,''
                ') "Amount"
 FROM DUAL;

Amount
--------
-1234.56

alter session set NLS_NUMERIC_CHARACTERS = '.,';

SELECT TO_CHAR(TO_NUMBER('-AusDollars1.234,56','L9G999D99',
                        ' NLS_NUMERIC_CHARACTERS = '',.''
                          NLS_CURRENCY            = ''AusDollars''
                        '),'9999D99',
                'NLS_NUMERIC_CHARACTERS = ''.,''
                ') "Amount"
 FROM DUAL;

Amount
--------
-1234.56

现在,会话设置也不影响显示的值。但是,现在当然是字符串,而不是数字。

对于第二个查询,您在评论中显示的内容无效:

select TO_NUMBER('10,35','999G990D00','nls_numeric_characters=''.,''') amount from dual;

ERROR at line 1:
ORA-01722: invalid number

因为您输入了句号和逗号,所以回合错误,但是在固定了该回合的情况下,该数字的显示仍然取决于会话:

alter session set NLS_NUMERIC_CHARACTERS = ',.';
select TO_NUMBER('10,35','999G990D00','nls_numeric_characters='',.''') amount from dual;

    AMOUNT
----------
     10,35

alter session set NLS_NUMERIC_CHARACTERS = '.,';
select TO_NUMBER('10,35','999G990D00','nls_numeric_characters='',.''') amount from dual;

    AMOUNT
----------
     10.35

同样,您可以显式转换回字符串:

select TO_CHAR(
    TO_NUMBER('10,35','999G990D00','nls_numeric_characters='',.'''),
    '999G990D00',
    'nls_numeric_characters=''.,'''
  ) amount from dual;

AMOUNT
-----------
      10.35

无论使用哪种会话设置,结果都相同。

或者您可以通过字符串操作直接用逗号替换句点:

select REPLACE('10,35', ',', '.') amount from dual;

但是,如果您还需要使用组分隔符(如格式模型所建议的那样),则会变得很混乱。

相关问题