Сложные выражения со значением
Использование выражения CAST внутри SQL-кода
Предположим, что вы работаете для торговой компании, которая собирает данные о своих предполагаемых сотрудниках, а также о сотрудниках, которых вы уже наняли. Данные о предполагаемых сотрудниках вы разместили в таблице PROSPECT (потенциальный сотрудник), а различаете каждого из них по его номеру социального страхования (Social Security Number, SSN), который вы храните в виде данных типа CHAR(9). Данные о работающих сотрудниках вы разместили в другой таблице, EMPLOYEE (сотрудник), и различаются они также по своему номеру социального страхования, но имеющему уже тип INTEGER. Теперь вам требуется получить список людей, данные о которых содержатся в обеих таблицах. Чтобы выполнить эту задачу, используйте выражение CAST:
SELECT * FROM EMPLOYEE WHERE EMPLOYEE.SSN = CAST(PROSPECT.SSN AS INTEGER);
Использование выражения CAST при взаимодействии SQL и базового языка
Главное предназначение выражения CAST состоит в том, чтобы работать с такими типами данных, которые есть в SQL, но отсутствуют в базовом языке. Вот некоторые примеры таких типов.
- Fortran и Pascal не имеют типов данных DECIMAL и NUMERIC.
- Стандартный COBOL не содержит типов данных FLOAT и REAL.
- Ни в каком языке, кроме SQL, нет типа данных DATETIME.
Предположим, что для доступа к таблицам, у которых есть столбцы с типом данных DECIMAL (5.3), вам нужен язык Fortran или Pascal. При этом требуется избежать неточности, которая может случиться, если переводить значения из этих столбцов в тип данных REAL, используемый в этих двух языках. Эту задачу можно выполнить, используя CAST для перевода данных в базовые переменные (и из базовых переменных), которые имеют тип символьной строки. Например, числовое значение 198.37 переводится в значение '0000198.37' типа CHAR(IO). Вначале в тип CHAR(IO) с помощью CAST преобразуются те данные типа DECIMAL (5.3), которые относятся к сотруднику с идентификационным номером, находящимся в базовой переменной:emp_id_var:
SELECT CAST(Salary AS CHAR(10)) INTO:salary_var FROM EMP WHERE EmpID =:emp_id_var;
Затем приложение проверяет появившуюся в переменной:salary_var символьную строку и присваивает этой переменной новое значение, а затем с помощью следующего кода SQL обновляет базу данных:
UPDATE EMP SET Salary = CAST(:salary_var AS DECIMAL(5.3)) WHERE EmpID =:emp_id_var;
С символьными строками, такими как '000198.37', работать в языках Fortran и Pascal очень трудно, но для выполнения в этих языках нужных операций можно написать набор специальных процедур. В принципе, в любом базовом языке можно получать и обновлять любые SQL-данные, а также получать и задавать точные значения.
Вообще говоря, выражение CAST лучше всего подходит для преобразования типов данных базового языка в типы данных базы и наоборот, а не для преобразования одних типов данных базы в другие.