Спецификация типа данных
Функция
Определение оператора явного преобразования типов данных.
Спецификация
::=
Синтаксические правила
-
< Значимое выражение > должно иметь числовой, дата-время, логический, байтовый или символьный тип данных языка 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
.