如何对ABAP内表使用SELECT?多级条件过滤问题求助
你代码里的核心问题在于SELECT语句仅能用于查询数据库表/视图,无法直接操作ABAP内表,所以针对内表编写的那两段SELECT语法完全不合法。下面给你几种可行的解决方式:
方案1:通过LOOP+DELETE逐次过滤内表
该方法适配所有ABAP版本,先读取全量数据,再逐行删除不符合条件的记录:
"将全量数据库数据读取至内表 SELECT * FROM TABLE INTO CORRESPONDING FIELDS OF TABLE @itab. "若iv_name不为空则执行第一次过滤 IF iv_name IS NOT INITIAL. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_line>). IF <fs_line>-name <> iv_name. DELETE itab INDEX sy-tabix. ENDIF. ENDLOOP. ENDIF. "若iv_age不为空则执行第二次过滤 IF iv_age IS NOT INITIAL. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_line2>). IF <fs_line2>-age <> iv_age. DELETE itab INDEX sy-tabix. ENDIF. ENDLOOP. ENDIF.
方案2:使用FILTER表达式(ABAP 7.40及以上版本)
利用内表的FILTER函数直接生成过滤后的新内表,代码更简洁高效:
"将全量数据库数据读取至内表 SELECT * FROM TABLE INTO CORRESPONDING FIELDS OF TABLE @itab. "若iv_name不为空则过滤 IF iv_name IS NOT INITIAL. itab = FILTER #( itab WHERE name = iv_name ). ENDIF. "若iv_age不为空则再次过滤 IF iv_age IS NOT INITIAL. itab = FILTER #( itab WHERE age = iv_age ). ENDIF.
方案3:优化思路——直接从数据库动态过滤(推荐)
前两种方法都是先读取全量数据再过滤,数据量大时性能损耗严重。更优的方式是动态构建WHERE条件,仅从数据库读取符合要求的数据:
DATA(lv_where) = VALUE string( ). "拼接name条件 IF iv_name IS NOT INITIAL. lv_where = |{ lv_where } AND NAME = @iv_name|. ENDIF. "拼接age条件 IF iv_age IS NOT INITIAL. lv_where = |{ lv_where } AND AGE = @iv_age|. ENDIF. "去掉开头多余的AND IF lv_where IS NOT INITIAL. lv_where = lv_where+4. "从第5个字符开始截取,移除开头的" AND " ENDIF. "执行查询,仅读取符合条件的数据 SELECT * FROM TABLE INTO CORRESPONDING FIELDS OF TABLE @itab WHERE (lv_where).
这种方式避免了全量数据的传输与内存占用,在数据库表数据量较大时优先使用。
内容的提问来源于stack exchange,提问作者user16365685
相关产品推荐
相关产品推荐

