Сравнение строк: OR, LOOKUP, CAN-DO, INDEX
Рассмотрим сравнение строк на примере (Программа 68), где требуется проверить, принимает ли переменная одно из заданных значений. Это может быть сделано с помощью оператора OR или встроенных функций LOOKUP, CAN-DO или INDEX.
Программа 68. Сравнение строк
DEFINE VARIABLE cProjStatus AS CHARACTER NO-UNDO.
cProjStatus = ‘L’.
IF cProjStatus = 'L'
OR cProjStatus = 'T'
OR cProjStatus = 'C' THEN
DISPLAY 'Project Status'.
IF LOOKUP(cProjStatus,'L,T,C') > 0 THEN
DISPLAY 'Project Status'.
IF INDEX('LTC', cProjStatus) > 0 THEN
DISPLAY 'Project Status'.
IF CAN-DO('L,T,C', cProjStatus) THEN
DISPLAY 'Project Status'.
Использование функций вместо оператора OR существенно влияет на производительность и объем r-кода. Результаты приведены в таблицах (Таблица 16) и (Таблица 17). Отметим, что существует некоторая разница в производительности при использовании различных функций, но она незначительна по сравнению с оператором OR.
Таблица 16. Сравнение строк – выигрыш в производительности
|
Количество сравнений |
OR | LOOKUP | INDEX |
CAN-DO |
| 1 | Base | 25% | 25% | 38% |
| 2 | Base | 54% | 62% | 62% |
| 5 | Base | 76% | 76% | 80% |
| 10 | Base | 84% | 87% | 89% |
Таблица 17. Сравнение строк – выигрыш в объеме кода
|
Количество сравнений |
OR | LOOKUP | INDEX |
CAN-DO |
| 1 | Base | 10% | 10% | 33% |
| 2 | Base | 34% | 34% | 51% |
| 5 | Base | 63% | 63% | 73% |
| 10 | Base | 77% | 79% | 82% |
В то же время, использование функций имеет некоторые недостатки:
- В условии WHERE, в отличие от оператора OR, функции LOOKUP, CAN-DO и INDEX не позволяют использовать индекс при работе с индексными полями таблиц базы данных.
- В случае функции CAN-DO мы не может определить разделители, в отличие от LOOKUP.
- CAN-DO также рассматривает “*” и “!” как специальные символы, которые могут быть причиной проблем, если эти символы будут в исходной строке.
