Преобразование в тип DECIMAL
Из типа string
Строгий режим
Если исходный тип допускает NULL, возвращается тип, допускающий NULL;
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL;
Определение BNF
<decimal> ::= <whitespace>* <value> <whitespace>*
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
<value> ::= <sign>? <significand> <exponent>?
<sign> ::= "+" | "-"
<significand> ::= <digits> "." <digits> | <digits> | <digits> "." | "." <digits>
<digits> ::= <digit>+
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<exponent> ::= <e_marker> <sign>? <digits>
<e_marker> ::= "e" | "E"
Описание правил
-
Поддерживаются только десятичные цифры;
-
Поддерживается экспоненциальная запись;
-
Поддерживается округление;
-
В начале и в конце строк допускаются произвольные пробельные символы, в том числе: " ", "\t", "\n", "\r", "\f", "\v".
-
При переполнении целой части возвращается ошибка;
-
При некорректном формате возвращается ошибка.
Примеры
| Строка | Decimal(18, 6) | Комментарий |
|---|---|---|
| "123.1234567" | 123.123457 | Округление |
| "12345." | 12345.000000 | |
| "12345" | 12345.000000 | |
| ".123456" | 0.123456 | |
| " \t\r\n\f\v123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и в конце |
| " \t\r\n\f\v+123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и в конце, со знаком плюс |
| " \t\r\n\f\v-123.456 \t\r\n\f\v" | -123.456000 | С пробельными символами в начале и в конце, со знаком минус |
| " \t\r\n\f\v+1.234e5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись |
| " \t\r\n\f\v+1.234e+5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись с положительным показателем степени |
| " \t\r\n\f\v+1.234e-1 \t\r\n\f\v" | 0.123400 | Экспоненциальная запись с отрицательным показателем степени |
| "123.456a" | Ошибка | Некорректный формат |
| "1234567890123.123456" | Ошибка | Переполнение |
Нестрогий режим
Всегда возвращается тип, допускающий NULL;
Определение BNF
<decimal> ::= <whitespace>* <value> <whitespace>*
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
<value> ::= <sign>? <significand> <exponent>
<sign> ::= "+" | "-"
<significand> ::= <digits> | <digits> "." <digits> | <digits> "." | "." <digits>
<digits> ::= <digit>+
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<exponent> ::= <e_marker> <sign>? <digits>
<e_marker> ::= "e" | "E"
Описание правил
-
Поддерживаются все допустимые форматы строгого режима;
-
При переполнении выполняется преобразование в NULL;
-
При некорректном формате выполняется преобразование в NULL.
Примеры
| Строка | Decimal(18, 6) | Комментарий |
|---|---|---|
| "123.1234567" | 123.123457 | Округление |
| "12345." | 12345.000000 | |
| "12345" | 12345.000000 | |
| ".123456" | 0.123456 | |
| " \t\r\n\f\v123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и в конце |
| " \t\r\n\f\v+123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и в конце, со знаком плюс |
| " \t\r\n\f\v-123.456 \t\r\n\f\v" | -123.456000 | С пробельными символами в начале и в конце, со знаком минус |
| " \t\r\n\f\v+1.234e5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись |
| " \t\r\n\f\v+1.234e+5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись с положительным показателем степени |
| " \t\r\n\f\v+1.234e-1 \t\r\n\f\v" | 0.123400 | Экспоненциальная запись с отрицательным показателем степени |
| "123.456a" | NULL | Некорректный формат |
| "1234567890123.123456" | NULL | Переполнение |
Из типа bool
true преобразуется в 1, false преобразуется в 0.
Строгий режим
При переполнении возникает ошибка (например, cast bool as decimal(1, 1)).
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Нестрогий режим
При переполнении выполняется преобразование в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast bool as decimal(1, 1)), возвращается тип, допускающий NULL; -
В остальных случаях возвращается тип, не допускающий NULL.
Из целочисленного типа
Строгий режим
При переполнении возникает ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| int | Decimal(18, 9) | Комментарий |
|---|---|---|
| 123 | 123.00000000 | |
| 2147483647 | Ошибка | Переполнение |
Нестрогий режим
При переполнении выполняется преобразование в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast int as decimal(1, 0)), возвращается тип, допускающий NULL; -
В остальных случаях возвращается тип, не допускающий NULL (например,
cast int as decimal(18, 0)).
Примеры
| int | Decimal(18, 9) | Комментарий |
|---|---|---|
| 123 | 123.00000000 | |
| 2147483647 | NULL | Переполнение |
Из типов float/double
Поддерживается округление.
Строгий режим
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
-
Infinity и NaN приводят к ошибкам.
-
При переполнении возникает ошибка.
Примеры
| float/double | Decimal(18, 3) | Комментарий |
|---|---|---|
| 1.1239 | 1.124 | Округление |
| 3.40282e+38 | Ошибка | Переполнение |
| Infinity | Ошибка | |
| NaN | Ошибка |
Нестрогий режим
Всегда возвращается тип, допускающий NULL.
-
+/-Inf преобразуется в NULL;
-
NaN преобразуется в NULL;
-
При переполнении выполняется преобразование в NULL.
Примеры
| float/double | Decimal(18, 6) | Комментарий |
|---|---|---|
| 1.123456 | 1.123456 | |
| 3.40282e+38 | NULL | Переполнение |
| Infinity | NULL | |
| NaN | NULL |
Преобразование между типами DECIMAL
Поддерживается округление.
Строгий режим
При переполнении возникает ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| Decimal(18, 8) | Decimal(10, 6) | Комментарий |
|---|---|---|
| 1234.12345678 | 1234.123457 | Округление |
| 12345.12345678 | Ошибка | Переполнение целой части |
Нестрогий режим
При переполнении выполняется преобразование в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast decimal(18, 0) as decimal(9, 0)), возвращается тип, допускающий NULL; -
В остальных случаях возвращается тип, не допускающий NULL (например,
cast decimal(9, 0) as decimal(18, 0)).
Примеры
| Decimal(18, 8) | Decimal(10, 6) | Комментарий |
|---|---|---|
| 1234.12345678 | 1234.123457 | Округление |
| 12345.12345678 | NULL | Переполнение целой части |
Из типа date
Не поддерживается.
Из типа datetime
Не поддерживается.
Из типа TIMESTAMP_NS
Не поддерживается.
Из типа time
Не поддерживается.
Из других типов
Не поддерживается