Параметры функции Oracle to_number - PullRequest
4 голосов
/ 26 октября 2011

У меня проблемы с вторым и третьим параметрами функции TO_NUMBER. Один из них зависит от другого? Как работает параметр nls_params? Я не могу понять, как результат запроса

SELECT TO_NUMBER('17.000,23', 
             '999G999D99', 
             'nls_numeric_characters='',.'' ')  
             REFORMATTED_NUMBER 
FROM   DUAL; 

может быть 17000.23. Может кто-нибудь объяснить, пожалуйста, процесс вышеупомянутого преобразования.

P.S. Приведенный выше запрос взят из книги подготовки Oracle Expert SQL Expert Certificate.

Ответы [ 2 ]

5 голосов
/ 26 октября 2011

вы говорите функции TO_NUMBER, что два символа ,. в nls_numeric_characters представляют десятичный разделитель и разделитель тысяч

G (thousands seperator) = .
D (decimal seperator)   = ,

так что оно видит число как семнадцать тысяч целых двадцать три.

см .: http://download.oracle.com/docs/cd/B13789_01/olap.101/b10339/x_stddev022.htm#i78653

1 голос
/ 26 октября 2011

Теперь я отвечу на свой вопрос.При использовании функции TO_NUMBER я упустил важный момент: все, что я получу от функции TO_NUMBER, будет числом.И число не включает в себя ничего, кроме десятичной точки и E научных обозначений.Таким образом, 17 788,99 на самом деле не число, а строковое представление 17788,99.

Если мы попытаемся вычесть 500 из 17 788,99, мы потерпим неудачу (ну, Oracle неявно преобразует числовые строки в числа и наоборот, но в основном мы не можем выполнять арифметические операции между строками и числами).Я уверен, что функция TO_NUMBER почти никогда не используется для выбора значения столбца.Скорее, он используется для выполнения арифметических операций.Вместо этого мы используем TO_CHAR, чтобы показать значение столбца или любое числовое выражение в аккуратном, удобном для чтения формате.Модели fomat и nls_params предназначены не только для функции TO_NUMBER, но и для TO_CHAR.

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