|
Программирование >> Преобразование значений null
Окончательное результирующее множество представляет весь процесс обработки заказа, от дня получения до дня, когда он должен быть поставлен. 1 3 27-SEP-2005 29-SEP-2005 2 3 27-SEP-2005 29-SEP-2005 3 3 27-SEP-2005 29-SEP-2005 Теперь, имея по три строки для каждого заказа, просто с помощью выражения CASE создаем дополнительные столбцы для представления статуса контроля и поставки. Первая строка каждого заказа в столбцах VERIFIED и SHIPPED должна содержать значения NULL. Во второй строке значение NULL установлено для столбца SHIPPED. В третьей строке каждого заказа ни в одном столбце не должно быть значения NULL. Окончательный результат показан ниже: with nrows as ( select level n from dual connect by level <= 3 select id, order date, process date, case when nrows.n >= 2 then process date+1 else null end as verified, case when nrows.n = 3 then process date+2 else null end as shipped from ( select nrows.n id, sysdate+nrows.n order date, sysdate+nrows.n+2 process date from nrows ) orders, nrows PostgreSQL Результирующее множество, представленное в разделе Задача , получено посредством вложенного запроса ORDERS и показано ниже: select gs.id, current date+gs.id as order date, current date+gs.id+2 as process date from generate series(1,3) gs (id) ID ORDER DATE PROCESS DATE 1 25-SEP-2005 27-SEP-2005 2 26-SEP-2005 28-SEP-2005 3 27-SEP-2005 29-SEP-2005 Приведенный выше запрос для составления трех строк, представляющих заказы, которые подлежат обработке, просто использует оператор GENERATE SERIES. GENERATE SERIES возвращает значения 1, 2 и 3. Эти числа добавляются к CURRENT DATE для представления дат получения заказов. Поскольку в разделе Задача определено, что обработка заказа занимает два дня, для получения даты окончания выполнения заказа в приведенном выше запросе к значению ORDER DATE добавляется два дня (к CURRENT DATE прибавляем значение, возвращенное GENERATE SERIES, и еще два дня). Получив базовое результирующее множество, перейдем к созданию декартова произведения, поскольку стоит задача получить по три строки для каждого заказа. Для этого используем функцию GENERA- TE SERIES: select gs.n, orders.* from ( select gs.id, current date+gs.id as order date, current date+gs.id+2 as process date from generate series(1,3) gs (id) ) orders, generate series(1,3)gs(n) N ID ORDER DATE PROCESS DATE 1 1 25-SEP-2005 27-SEP-2005 2 1 25-SEP-2005 27-SEP-2005 3 1 25-SEP-2005 27-SEP-2005 1 2 26-SEP-2005 28-SEP-2005 2 2 26-SEP-2005 28-SEP-2005 3 2 26-SEP-2005 28-SEP-2005 1 3 27-SEP-2005 29-SEP-2005 2 3 27-SEP-2005 29-SEP-2005 3 3 27-SEP-2005 29-SEP-2005 Теперь, имея по три строки для каждого заказа, просто с помощью выражения CASE создаем дополнительные столбцы для представления статуса контроля и поставки. Первая строка каждого заказа в столбцах VERIFIED и SHIPPED должна содержать значения NULL. Во второй строке значение NULL установлено для столбца SHIPPED. В третьей строке каждого заказа ни в одном столбце не должно быть значения NULL. Окончательный результат показан ниже: select id, order date, process date, case when gs.n >= 2 then process date+1 else null end as verified, case when gs.n = 3 then process date+2 else null end as shipped from ( select gs.id, current date+gs.id as order date, current date+gs.id+2 as process date from generate series(1,3) gs(id) ) orders, generate series(1,3)gs(n) ID ORDER DATE PROCESS DATE VERIFIED SHIPPED 1 25-SEP-2005 27-SEP-2005 1 25-SEP-2005 27-SEP-2005 28-SEP-2005 1 25-SEP-2005 27-SEP-2005 28-SEP-2005 29-SEP-2005 2 26-SEP-2005 28-SEP-2005 2 26-SEP-2005 28-SEP-2005 29-SEP-2005 2 26-SEP-2005 28-SEP-2005 29-SEP-2005 30-SEP-2005 3 27-SEP-2005 29-SEP-2005 3 27-SEP-2005 29-SEP-2005 30-SEP-2005 3 27-SEP-2005 29-SEP-2005 30-SEP-2005 01-OCT-2005 Окончательное результирующее множество представляет весь процесс обработки заказа, от дня получения до дня, когда он должен быть поставлен.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.065
При копировании материалов приветствуются ссылки. |