%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
相关产品推荐
相关产品推荐

