您可以在查询中使用TO_NUMBER函数指定小数点分隔符。无需更改会话或在系统中配置参数。
SELECT TO_NUMBER('-AusDollars100','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars''
') "Amount"
FROM DUAL;
尝试这种方式,但不起作用
可以解决吗?
答案 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;
但是,如果您还需要使用组分隔符(如格式模型所建议的那样),则会变得很混乱。