Спецификация типа данных
Функция
Определение оператора явного преобразования типов данных.
Спецификация
::=Синтаксические правила
-
<Значимое выражение> должно иметь числовой, дата-время, логический, байтовый или символьный тип данных языка SQL (возможно, с указанием длины, точности и масштаба) либо иметь NULL-значение.
-
Если из контекста запроса невозможно определить тип данных NULL-значения <значимого выражения>, по умолчанию используется
INTEGER.Сравните:
-
используется значение по умолчанию:
select NULL from $$$USR where rowid >2;
-
тип данных берется из контекста:
select 'A' union select NULL; | A| | |
-
явное указание типа данных:
select 1, null union select null, cast null as char(10);
-
-
<Значимое выражение>не должно быть<запросом выборки>. -
Каждое числовое выражение может быть явно преобразовано в любой другой допустимый числовой тип или в другую точность представления. Если результат преобразования (с возможным округлением) не попадает в диапазон значений типа результата, то выдается ошибка.
select cast 5.7 as int, cast (2000+length(user))/76.6 as real; | 5| 26.97128| select 5.78865366547895, cast 5.78865366547895 as decimal(11,5); |5.78865366547895 |5.78865 |
Общие правила
-
Символьное выражение может быть преобразовано в любой числовой тип. При этом в результате символьного выражения отсекаются ведущие и концевые пробелы, а остальные символы преобразуются в числовое значение по правилам языка SQL. Невозможность преобразования диагностируется ошибкой.
select cast '6754' as bigint, cast '6774.9' as double, cast '123' || '456' as bigint; | 6754| 6774.9| 123456| -
Если явно заданная длина символьного типа недостаточна, и преобразованное значение не помещается в нем, то значение усекается справа, и ошибка не выдается.
-
Возможно явное преобразование символьного типа в символьный тип с другой длиной. Если длина результата больше длины аргумента, то значение дополняется пробелами; если меньше, то усекается. Сообщений об ошибках при этом не выдается.
select cast model as char(30) as "Модель" from auto; select cast ' Модель ' as char(20) union select model from auto order by 1;
Обеспечение совместимости типов при объединении запросов:
select name from person union select cast null as char(20) from person;
-
NULL-значение преобразуется в NULL-значение соответствующего типа.
-
Числовое выражение может быть преобразовано в символьный тип. Если длина символьного типа не указана явно, то она устанавливается следующим образом:
-
для
SMALLINT–6символов; -
для
INTEGER–11символов; -
для
BIGINT–20символов; -
для
REAL–15символов; -
для
DOUBLE–7символов; -
для
DECIMAL–32символа.
select cast 567 as char(10);
-
-
Поддерживаются следующие неявные преобразования типов:
-
преобразование
NULLв любой тип данных; -
для строковых типов – объединение элементов с разной длиной;
-
для констант – преобразования
CHARвVARCHAR,INTEGERвSMALLINT,INTEGERвBIGINT,DOUBLEвREAL,DECIMALвDOUBLE,DECIMALвREAL.Все остальные преобразования необходимо выполнять с помощью оператора
CAST.
-
-
При преобразовании логических выражений константные значения преобразуются сразу, например:
cast(0 as boolean) -> FALSE cast(true as boolean) -> TRUE cast(true as integer) -> 1
а неконстантные выражения – через выражение
CASE, например:cast (b as integer) -> case b when false then 0 else 1 end
-
Поддерживаются запросы типа:
-
SELECT CASE ... WHEN ... TNEN IS NULL ELSE <значение>; -
SELECT CASE ... WHEN ... TNEN <значение> ELSE NULL; -
SELECT NULL FROM ... UNION SELECT <значение> FROM ...; -
SELECT <значение> FROM ... UNION SELECT NULL FROM ...;
для них не надо явно писать
CAST NULL AS. -
-
Если в
UNIONстоят значения одинакового типа (символьного), но разной длины, то происходит автоматическое приведение типа без явного задания оператораCAST. -
При операции
UNIONпреобразование строковых констант типаVARCHARв типVARCHARне выполняется. -
При преобразовании
CAST CHAR AS VARCHARдополнение пробеламиVARCHARне выполняется. -
При присвоении по команде
INSERT (UPDATE)значенияCAST AS <строковый тип>некоторому столбцу без явного указания длины строкового типа длина делается равной длине столбца. -
При обработке числовой константы, если не удалось ее преобразовать к типу
DECIMAL, делается попытка преобразовать ее к типуDOUBLE. -
При преобразовании значений типа
DATEв строковые и целые типы данных и обратно через конструкциюCASTиспользуются стандартные форматы (см. функцииTO_CHAR,TO_DATEиTO_NUMBER).select cast '28.04.2003' as date, cast sysdate as char(20); |28.04.2003:00:00:00.00 |10.04.2003:14:08:59.00 |
-
Если аргумент агрегатной функции
SUMимеет тип данныхINTEGER, то при вычислении выражения типаCAST(SUM(<значимое выражение>) AS INTEGER)он не преобразуется в тип данныхDECIMAL(сумма считается в целых числах). Это справедливо и для типов данныхSMALLINT,BIGINT.