Явные преобразования типов или доменов и оператор 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 должен быть одним и тем же.