Выбрать главу

■ Будут использованы скобки для указания следующего порядка вычислений:

сначала следует операция UNION между таблицами products и

more_products, а затем операция INTERSECT.

□ (SELECT product_id, product_type_id, name

FROM products

UNION

SELECT prd_id, prd_type_id, name

FROM more_products)

INTERSECT

SELECT product_id, product_type_id, name

FROM product_changes;

PRODUCT_ID PRODUCT_TYPE_ID NAME

1 Modern Science

В следующем примере изменено положение скобок таким образом,

чтобы первым выполнялся оператор INTERSECT; обратите внимание на разницу

в результатах:

□ SELECT product_id, product_type_id, name

FROM products

UNION

(SELECT prd_id, prd_type_id, name

FROM more_products

INTERSECT

SELECT product_id, product_type_id, name

FROM product_changes);

PRODUCT_ID PRODUCT_TYPE_ID NAME

1 1 Modern Science

2 1 Chemistry

3 2 Supernova

196 Глава 7

4 2 Tank War

5 2 Z Files

6 2 2412: The Return

7 3 Space Force 9

8 3 From Another Planet

9 4 Classical Music

10 4 Pop 3

11 4 Creative Yell

12 My Front Line

На этом заканчивается обсуждение операторов для работы со множествами.

Использование функции TRANSLATE()

Функция TRANSLATED, исходная_строка, целевая_строка) используется для

конвертирования вхождений символов из параметра входная_строка в

строке х в соответствующие символы параметра целевая_строка. Самый

простой способ понять, как работает функция TRANSLATE(), - рассмотреть

некоторые примеры.

В следующем примере функция TRANSLATEO используется для сдвига

каждого символа строки SECRET MESSAGE: MEET ME IN THE PARK на четыре

символа вправо: А переходит в Е, В - в F и т. д.:

□ SELECT TRANSLATE(’ SECRET MESSAGE: MEET ME IN THE PARK’ ,

‘ ABCDEFGHIJKKLMNOPQRSTUVWXYZ' ,

‘ EFGHKLMNOPQRSTUVWXYZABCD’ ) FROM dual;

TRANSLATE(' SECRETMESSAGE:MEETMEINTH

WIGVIX QIWWEKI: QIIX QI MR XLI TEVO

В следующем примере выходные данные предыдущего примера сдвигаются

на четыре разряда влево: Е превращается в A, F - в В и т. д.:

□ SELECT TRANSLATE(’WIGVIX QIWWEKI: QIIX QI MR XLI TEVO',

‘ EFGHIJKLMNOPQRSTUVWXYZABCD’ ,

' ABCDEFGHIJKLMNOPQRSTUVWXYZ’ ) from DUAL;

TRANSLATE( 'WIGVIXQIWWEKI:QIIXQIMRXL

SECRET MESSAGE: MEET ME IN THE PARK

Можно передавать в функцию TRANSLATE() и имена столбцов. В следующем

примере в функцию TRANSLATE() передается имя столбца name таблицы

products, что приводит к сдвигу букв в названии товара на четыре позиции

вправо:

□ SELECT product_id, TRANSLATE(name,

‘ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghklmnopqrstuvwxyz',

'EFGHIJKLMNOPQRSTUVWXYZABCDefghklmnopqrstuvwxyzabcd’)

FROM products;

PRODUCT_ID TRANSLATE(NAME,’ ABCDEFGHIJKLMN

1 Qshivr Wgmirgi

Расширенные запросы 197

2 Gliqmwxvc

3 Wytivrsze

4 Xero Aev

5 D Jmpiw

6 2412: Xli Vixyvr

7 Wtegi Jsvgi 9

8 Jvsq Ersxliv Tperix

9 Gpewwmgep Qywmg

10 Tst 3

11 Gviexmzi Cipp

12 Qc Jvsrx Pmri

Можно также использовать TRANSLATEO для конвертирования чисел. В

следующем примере в исходном числе 12345 производятся следующие

преобразования: цифра 5 превращается в 6, 4 - в 7, 3 - в 8, 2 - в 9, а 1 - в 0:

П SELECT TRANSLATE(12345,

54321,

67890)

from DUAL;

TRANS

09876

Использование функции DEC0DE()

Функция 0ЕС00Е(значение, строка_поиска, результат, значение_по_умолча-

нию) используется для сравнения входного параметра значения с параметром

строка_поиска. Если их значения равны, DECODE( ) возвращает результат,

в противном случае будет возвращено значение_по_умолчанию. Функция

DEC0DEO позволяет выполнять логические операции если-то-иначе

(if-then-else) непосредственно в SQL без обращения к PL/SQL. Каждый из

параметров DEC0DE() может быть столбцом, литеральным значением, функцией

или подзапросом.

Примечание Функция DEC0DE() является старой функцией Oracle собственной разработки,

и в случае, если вы используете базу данных Oracle 9i и выше, вам следует использовать выражения

CASE вместо обращения к этой функции. Функция DEC0DE() упоминается здесь, поскольку

вы можете встретиться с ней при использовании более ранних версий базы данных

Oracle.

Следующий пример иллюстрирует прменение функции DECODE( ) с литеральными

значениями; DEC0DE() возвращает 2 (1 сравнивается с 1, и поскольку

они равны, возвращается значение 2):

П SELECT DEC0DE(1, 1, 2, 3)

FROM dual;

DEC0DE(1,1,2,3)

2

198 Глава 7

Следующий пример использует DECODE( ) для сравнения 1 с 2, и поскольку

они не равны, то будет возвращено число 3:

SELECT DEC0DE(1, 2, 1, 3)

FROM dual;

DEC0DE(1,2 ,1 ,3 )

В следующем примере выполняется сравнение столбца available таблицы

more_products. Если available равно Y, возвращается строка Product is

available (товар имеется в наличии), а во всех остальных случаях возвращается

строка Product is not available (товар отсутствует):

SELECT prd_id, available,

DECODE(available, 'Y ’, ‘Product is available’,

‘Product is not available’)

FROM more_products;

prd_id a DECODE(AVAILABLE,' Y ’ , ’ PR

1 Y Product i s a v a ila b le

2 Y Product i s a v a ila b le

3 N Product i s not a v a ila b le