Сравнение строк: 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 также рассматривает “*” и “!” как специальные символы, которые могут быть причиной проблем, если эти символы будут в исходной строке.