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