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