TO_NUMBER, укажите десятичный разделитель в запросе - PullRequest
0 голосов
/ 19 марта 2019

Вы можете указать десятичный разделитель с помощью функции TO_NUMBER в запросе.Без необходимости изменять сеанс или настраивать параметр в системе.

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

Попробуйте этот способ, но он не работает

Можно ли это решить?

1 Ответ

0 голосов
/ 21 марта 2019

Функция 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;

, хотя это становится грязно, еслиу вас также могут быть разделители групп, как предполагает модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...