Q3_19 Формирование отчета, в котором содержимое столбца разворачивается в ряд столбцов отчета. Отчет должен содержать по строкам список сорудников (номера и имена служащих), по столбцам наименования отделов, а на пересечении знак ‘+’, если служащий работает в соответствующем отделе (только для отделов 10,20,30).
demo@10g> select employee_id, last_name,
(select decode(department_id,10,' + ',NULL) from department
where employee.department_id=department.department_id) acc_new_york,
(select decode(department_id,20,' + ',NULL) from department
where employee.department_id=department.department_id) res_dallas,
(select decode(department_id,30,' + ',NULL) from department
where employee.department_id=department.department_id) sal_chicago
from employee
where department_id in(10,20,30);
В этом запросе создается пять столбцов, три последних из которых создаются с помощью функции decode.
Функция decode в данном запросе обрабатывает значения столбца department_id (первым параметром функции decode является название столбца, для которого эта функция используется).. Если в этом столбце извлекаемой строки для части запроса с алиас «acc_new_york» содержится значение «10» (второй параметр функции decode в данной части запроса имеет значение «10»), функция decode вернет символ «+» (третий параметр функции decode имеет значение «+»), в противном случае – NULL (последний параметр функции decode имеет значение «NULL»). Если в этом столбце извлекаемой строки содержится значение «20» (для извлекаемой части запроса с алиас «res_dallas»), функция decode вернет символ «+», в противном случае – NULL. Если, наконец, в этом столбце извлекаемой строки содержится значение «30» (для извлекаемой части запроса с алиас «sal_chicago»), функция decode вернет символ «+», в противном случае – NULL.
Q3_20 А теперь усложним вывод отчета. На пересечении строк (сотрудников) и столбцов(названий отдела) надо выставить зарплату сотрудника в этом отделе (только для отделов 10,20,30).
demo@10g> select employee_id, last_name,
(select decode(department_id,10,salary,NULL) from department
where employee.department_id=department.department_id) acc_new_york,
(select decode(department_id,20,salary,NULL) from department
where employee.department_id=department.department_id) res_dallas,
(select decode(department_id,30,salary,NULL) from department
where employee.department_id=department.department_id) sal_chicago
from employee
where department_id in(10,20,30);
Q3_21 Повторим запросы Q3_19 и Q3_20 в другом варианте с использованием CASE выражения:
demo@10g> SELECT employee_id, last_name,
(CASE WHEN department_id=10 THEN ' + ' ELSE NULL END) acc_new_york,
(CASE WHEN department_id=20 THEN ' + ' ELSE NULL END) res_dallas,
(CASE WHEN department_id=30 THEN ' + ' ELSE NULL END) sal_chicago
from employee
where department_id in(10,20,30);
demo@10g> SELECT employee_id, last_name,
(CASE WHEN department_id=10 THEN salary ELSE NULL END) acc_new_york,
(CASE WHEN department_id=20 THEN salary ELSE NULL END) res_dallas,
(CASE WHEN department_id=30 THEN salary ELSE NULL END) sal_chicago
from employee
where department_id in(10,20,30);
Q3_22 С помощью функции DUMP определим код типа данных, длину записанной в ячейке столбца информации, набор символов (CharacterSet), коды последовательности символов (указанной длины), начиная с указанной стартовой позиции.
demo@10g> select dump(last_name,8) from employee
where department_id=10;
Если вместо «8» поставим «10» или «16» получим коды символов в соответствующей системе (десятичной или шестнадцатиричной).
demo@10g> select dump(last_name,10,2,2) from employee
where department_id=10;
demo@10g> select dump(last_name,1016) from employee
where department_id=10;
Добавление 1000 к цифре кодировки (16 в последнем запросе) позволяет вывести набор
Символов (CharacterSet).
Прежде чем вывести DUMP для столбца числового типа, отформатируем вывод:
demo@10g> select salary,dump(salary,1016) from employee
where department_id=10;
Q3_23 Функция VSIZE выводит число байт во внутреннем представлении Oracle
SELECT last_name, VSIZE (last_name) "BYTES"
FROM employee
WHERE department_id = 10;
Q3_24 Функция ORA_HASH вычисляет хэш значение для значений столбца. В нижеприводимом варианте хэш значение разыгрывается в диапазоне чисел 0 – 4294967295.
demo@10g> select ORA_HASH(salary) from employee
where department_id=10;
ORA_HASH(SALARY)
----------------
Можно изменить диапазон (установим, например, 100) и задать начальное значение последовательности случайных чисел (установим, например, 5), которая используется при формировании хэш значения
demo@10g> select ORA_HASH(salary,100,5) from employee