Явные преобразования типов или доменов и оператор CAST
Неявные преобразования типов не всегда удобны, недостаточно гибки и иногда чреваты ошибками. В SQL существует специальный оператор CAST, с помощью которого можно явно преобразовывать типы или домены в пределах допускаемых преобразований. Конструкция имеет следующий синтаксис:
CAST ({scalar-expression | NULL } AS {data_type | domain_name})
Оператор преобразует значение заданного скалярного выражения к указанному типу или к базовому типу указанного домена. Результатом применения оператора CAST к неопределенному значению является неопределенное значение. Для значений, отличных от неопределенных, в стандарте приводятся подробные правила выполнения преобразований, которые интуитивно ясны.
Поясним действие оператора CAST в наиболее важных случаях. Примем следующие обозначения типов данных:
EN | – точные числовые типы (Exact Numeric) |
AN | – приблизительные числовые типы (Approximate Numeric) |
C | – типы символьных строк (Character) |
FC | – типы символьных строк постоянной длины (Fixed-length Character) |
VC | – типы символьных строк переменной длины (Variable-length Character) |
B | – типы битовых строк (Bit String) |
FB | – типы битовых строк постоянной длины (Fixed-length Bit String) |
VB | – типы битовых строк переменной длины (Variable-length Bit String) |
D | – тип Date |
T | – типы Time |
TS | – типы Timestamp |
YM | – типы Interval Year-Month |
DT | – типы Interval Day-Time |
Пусть TD – это тип данных, к которому производится преобразование, а SD – тип данных операнда. Тогда допустимы следующие комбинации (“да” означает безусловную допустимость, “нет” – безусловную недопустимость и “?” – допустимость с оговорками):
SD | TD | ||||||||||
EN | AN | VC | FC | VB | FB | D | T | TS | YM | DT | |
EN | Да | Да | Да | Да | Нет | Нет | Нет | Нет | Нет | ? | ? |
AN | Да | Да | Да | Да | Нет | Нет | Нет | Нет | Нет | Нет | Нет |
C | Да | Да | ? | ? | Да | Да | Да | Да | Да | Да | Да |
B | Нет | Нет | Да | Да | Да | Да | Нет | Нет | Нет | Нет | Нет |
D | Нет | Нет | Да | Да | Нет | Нет | Да | Нет | Да | Нет | Нет |
T | Нет | Нет | Да | Да | Нет | Нет | Нет | Да | Да | Нет | Нет |
TS | Нет | Нет | Да | Да | Нет | Нет | Да | Да | Да | Нет | Нет |
YM | ? | Нет | Да | Да | Нет | Нет | Нет | Нет | Нет | Да | Нет |
DT | ? | Нет | Да | Да | Нет | Нет | Нет | Нет | Нет | Нет | Да |
По поводу ячеек таблицы, содержащих знак вопроса, необходимо сделать несколько оговорок:
(1) Если TD – интервал, и SD – тип точных чисел, то TD должен содержать единственное поле даты-времени;
(2) Если TD – тип точных чисел, и SD – интервал, то SD должен содержать единственное поле даты-времени;
(3) Если SD – тип символьных строк, и TD – тип символьных строк постоянной или переменной длины, то репертуар символов SD и TD должен быть одним и тем же.