You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

%LOOKUP如何选择搜索方法?无排序关键字时是否用顺序搜索?

%LOOKUP查找方式的判定问题

核心结论

即使通过SORTA语句对families(*).name做了排序,只要该字段在定义时未指定ASCEND或DESCEND关键字,%LOOKUP就会采用顺序搜索,而非二分查找。

依据说明

根据IBM i 7.4官方文档对%LOOKUPxx系列函数的定义:

%LOOKUPxx内置函数对有序数组(指定ASCEND或DESCEND关键字的数组)使用二分查找

简单来说,二分查找的触发条件是数组(或数组字段)在定义阶段就明确标记了排序属性,而非运行时通过SORTA临时调整存储顺序。SORTA只是改变了数据的实际排列,但不会修改数组的定义属性,所以%LOOKUP无法识别它是有序数组,仍会用默认的顺序搜索逻辑。

示例代码回顾

原数组结构定义如下:

DCL-DS families QUALIFIED DIM(10);
   name VARCHAR(25);
   num_children INT(10);
   DCL-DS children DIM(5);
      name VARCHAR(25);
      age INT(10);
   END-DS;
END-DS;

SORTA families(*).name;
IF %LOOKUP('Smith' : families(*).name);
   ...
ENDIF;

这里的name字段没有定义排序关键字,所以哪怕SORTA排序后,%LOOKUP依然走顺序搜索。

优化建议

如果想让%LOOKUP用二分查找提升效率,需要在定义name字段时添加ASCEND或DESCEND关键字,修改示例如下:

DCL-DS families QUALIFIED DIM(10);
   name VARCHAR(25) ASCEND; -- 明确指定升序属性
   num_children INT(10);
   DCL-DS children DIM(5);
      name VARCHAR(25);
      age INT(10);
   END-DS;
END-DS;

SORTA families(*).name;
IF %LOOKUP('Smith' : families(*).name);
   ...
ENDIF;

此时%LOOKUP会识别到该字段的有序属性,自动采用二分查找。

内容的提问来源于stack exchange,提问作者HockChai Lim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:00:15