■ Будут использованы скобки для указания следующего порядка вычислений:
сначала следует операция 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