Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / L89 / Формирование отчетов в SQL-PLUS.doc
Скачиваний:
49
Добавлен:
16.04.2013
Размер:
205.82 Кб
Скачать

2 Last_name,

3 hire_date,

4 LAST_DAY(hire_date)+1 INSURANCE_START_DATE

5 FROM person;

FIRST_NAME LAST_NAME HIRE_DATE INSURANCE

---------------- ----------------- --------- ----------

Charlene Atlas 01-FEB-02 01-MAR-02

Gary Anderson 15-FEB-02 01-MAR-02

Bobby Barkenhagen 28-FEB-02 01-MAR-02

Laren Baxter 01-MAR-02 01-APR-02

SQL>

Вложение функций для работы с датами

SQL>SELECT product_name,

2 quantity_on_hand,

3 last_stock_date,

4 LAST_DAY(ADD_MONTHS(last_stock_date,3))+1 RESTOCK_DATE

5 FROM product

6 WHERE quantity_on_hand <= 100

7 ORDER BY product_name;

PRODUCT_NAME QUANTITY_ON_HAND LAST_STOC RESTOCK_D

---------------------- ---------------- --------- ---------

Chrome Phoobar 100 15-JAN-03 01-MAY-03

Small Widget 1 15-JAN-03 01-MAY-03

Square Zinculator 1 09-JUL-00 01-NОV-00

SQL>

Пример решения проблемы с использованием TRUNC. Пусть были введены данные:

INSERT INTO product VALUES ‘Prod N’, 45, 1, SYSDATE);

SELECT * FROM product;

Однако, естественный запрос …

SELECT * FROM product

WHERE last_stock_date = ‘dd-mm-yy’; -- сегодняшняя дата

… не дал никаких результатов. Их нет потому, что данные типа DATEсодержат не только дату, но и время. Решение проблемы:Нужно усечь время.

Либо в запросе:

SELECT * FROM product

WHERE TRUNC(last_stock_date) = ‘dd-mm-yy’; -- сегодняшняя дата

Либо в БД:

DELETE FROM product

WHERE product_name = ‘Prod N’;

INSERT INTO product VALUES ‘Prod N’, 45, 1, TRUNC(SYSDATE));

Тогда данные будут получены при обычном запросе:

SELECT * FROM product

WHERE last_stock_date = ‘dd-mm-yy’; -- сегодняшняя дата

Числовые функции

ROUND(число, точность) – округляет число до точности (число знаков после запятой). Точность – целое число, если она с минусом, то округляется указанное число целочисленных разрядов.

TRUNC(число, точность) – урезает число до числа знаков после запятой (точности). Точность – целое число, если она с минусом, то округляется указанное число целочисленных разрядов.

MOD(число, мода) – вычисляет остаток от деления числа на моду.

Примеры.

TRUNC (100.567,1);

ROUND (999,-3);

Другие однострочные функции

NVL(входное_значение, результат_если_null) – присваивает значение пустому полю.

NVL2(входное_значение, результат_если_не_null, результат_если_null) – присваивает заранее определённое значение полю.

COALESCE(выражение [,выражение] …) – возвращает первое встреченное неNULLзначение выражения в списке.

Это почти эквивалентно упрощённому поисковому CASE-выражению, гдеk-условием является – “k-выражение IS NOT NULL” . Эта функция может использоваться как расширение функцииNVLдля нескольких входных значений, однако тогда требуется, чтобы последнее выражение вCOALESCEи было бы тем самым возвращаемым не-NULLвыражением, иначе (если все выражения равныNULL) функция вернётNULL.

DECODE(источник_входных_данных,

входное_значение_1, выходное_значение_1,

входное_значение_2, выходное_значение_2,

. . . . . . .

последнее_входное_значение, последнее_выходное_значение,

[вых.значение_по умолчанию_при_отсутствии_совпадений]

)

Это почти эквивалентно простому CASE-выражению (и похоже на множество вложенных конструкцийIF-THEN-ELSE).

Пример для NVL.

SELECT ename, sal+comm FROM emp;

Может ничего не выдать, если comm=NULL.

Чтобы в этом случае был выдан 0, нужен оператор

SELECT ename, sal+NVL(comm,0) FROM emp;

Обратите внимание, что если нужно выдать содержимое не текстового поля (числового или даты), при этом заменяя отсутствующие значения на некоторый условный знак (например, “N/A”), то не пройдёт очевидное решение:

SELECT ename, NVL(sal, “N/A”) “Sales”

FROM emp;

Поскольку в одном и том же поле окажутся и числа и текст.

Решение состоит в следующем:

SELECT ename, NVL(TO_CHAR(sal), “N/A”) “Sales”

FROM emp;

Пример для DECODE.

SELECT ename, DECODE(deptno,10,’New York’,

Соседние файлы в папке L89