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