要通过从另一个内表复制数据并过滤掉不满足 WHERE 条件的行来创建一个新的内表,可以使用 FILTER 操作符。
- FILTER 操作符根据指定的类型(可以是显式指定的非泛型表类型或在第一个括号前用作操作数类型符号的 # 字符)构建内表。
- 新内表的行是根据 WHERE 子句中指定的条件从现有内表中获取的。请注意,现有内表的表类型必须可以转换为指定的目标类型。
- 条件可以基于单个值或过滤表。
示例代码
" 定义一个结构类型
TYPES: BEGIN OF ty_line,
comp1 TYPE i,
comp2 TYPE c LENGTH 10,
END OF ty_line.
" 定义内表类型
TYPES ty_line_tab TYPE TABLE OF ty_line WITH EMPTY KEY.
" 创建并填充内表
DATA(itab) = VALUE ty_line_tab(
( comp1 = 1 comp2 = 'A' )
( comp1 = 2 comp2 = 'B' )
( comp1 = 3 comp2 = 'C' )
( comp1 = 4 comp2 = 'D' )
( comp1 = 5 comp2 = 'E' )
).
" 使用 FILTER 操作符创建一个新内表,过滤出 comp1 大于 2 的行
DATA(filtered_itab) = FILTER ty_line_tab(
itab USING KEY primary_key WHERE comp1 > 2
).
" 显示结果
cl_demo_output=>display( filtered_itab ).
解释
- 定义结构类型:定义一个结构类型
ty_line
,包含两个字段comp1
和comp2
。 - 定义内表类型:定义一个表类型
ty_line_tab
。 - 创建并填充内表:使用
VALUE
操作符创建并填充内表itab
。 - 使用
FILTER
操作符:使用FILTER
操作符从itab
中复制数据到filtered_itab
,同时过滤出comp1
大于 2 的行。USING KEY primary_key
指定使用主键进行过滤。 - 显示结果:使用
cl_demo_output=>display
显示过滤后的内表filtered_itab
的内容。
结果
运行此代码后,filtered_itab
将包含从 itab
中过滤出来的行,这些行满足 comp1 > 2
的条件。因此,filtered_itab
的内容将是:
( comp1 = 3, comp2 = 'C' )
( comp1 = 4, comp2 = 'D' )
( comp1 = 5, comp2 = 'E' )
ABAP 中的 FILTER
操作符非常强大,可以根据特定条件从内部表中选择或排除条目。使用 USING KEY
可以指定用于过滤操作的键,EXCEPT
允许排除符合条件的条目。
此外,还可以使用过滤表来匹配另一个表中的条目。这为在 ABAP 中操作和查询内部表提供了灵活的方式。
操作符 | 说明 |
---|---|
USING KEY | 指定用于评估 WHERE 条件的表键:可以是排序键或哈希键。如果内表没有这些键之一,则必须具有次表键,并且必须在 USING KEY 之后指定。 |
EXCEPT | 指定 EXCEPT 表示使用现有表中不符合 WHERE 子句中指定条件的行。如果未指定 EXCEPT ,则使用现有表中符合条件的行。 |
示例代码
以下是使用 FILTER
操作符的示例代码,展示如何使用 USING KEY
和 EXCEPT
选项进行过滤操作。
REPORT z_filter_demo.
TYPES: BEGIN OF struc,
num TYPE i,
data TYPE string,
END OF struc.
DATA: itab1 TYPE SORTED TABLE OF struc WITH NON-UNIQUE KEY num,
itab2 TYPE STANDARD TABLE OF struc WITH NON-UNIQUE SORTED KEY sec_key COMPONENTS num,
itab3 TYPE HASHED TABLE OF struc WITH UNIQUE KEY num.
DATA: filter_tab TYPE SORTED TABLE OF i WITH NON-UNIQUE KEY table_line.
INITIALIZATION.
APPEND VALUE #( num = 1 data = 'A' ) TO itab1.
APPEND VALUE #( num = 2 data = 'B' ) TO itab1.
APPEND VALUE #( num = 3 data = 'C' ) TO itab1.
APPEND VALUE #( num = 4 data = 'D' ) TO itab1.
APPEND VALUE #( num = 5 data = 'E' ) TO itab1.
itab2 = itab1.
itab3 = itab1.
APPEND 3 TO filter_tab.
APPEND 5 TO filter_tab.
DATA(f1) = FILTER #( itab1 WHERE num >= 3 ).
DATA(f2) = FILTER #( itab1 EXCEPT WHERE num >= 3 ).
DATA(f3) = FILTER #( itab2 USING KEY sec_key WHERE num >= 4 ).
DATA(f4) = FILTER #( itab3 WHERE num = 3 ).
DATA(f5) = FILTER #( itab1 IN filter_tab WHERE num = table_line ).
START-OF-SELECTION.
cl_demo_output=>new(
)->write( 'itab1:'
)->write( itab1
)->write( 'f1: 过滤 num >= 3' )->write( f1
)->write( 'f2: 排除 num >= 3' )->write( f2
)->write( 'f3: 使用次键过滤 num >= 4' )->write( f3
)->write( 'f4: 使用哈希键过滤 num = 3' )->write( f4
)->write( 'f5: 使用过滤表' )->write( f5
)->display( ).
示例代码解释
数据声明
DATA: itab1 TYPE SORTED TABLE OF struc WITH NON-UNIQUE KEY num,
itab2 TYPE STANDARD TABLE OF struc WITH NON-UNIQUE SORTED KEY sec_key COMPONENTS num,
itab3 TYPE HASHED TABLE OF struc WITH UNIQUE KEY num.
DATA: filter_tab TYPE SORTED TABLE OF i WITH NON-UNIQUE KEY table_line.
填充示例数据
INITIALIZATION.
APPEND VALUE #( num = 1 data = 'A' ) TO itab1.
APPEND VALUE #( num = 2 data = 'B' ) TO itab1.
APPEND VALUE #( num = 3 data = 'C' ) TO itab1.
APPEND VALUE #( num = 4 data = 'D' ) TO itab1.
APPEND VALUE #( num = 5 data = 'E' ) TO itab1.
itab2 = itab1.
itab3 = itab1.
APPEND 3 TO filter_tab.
APPEND 5 TO filter_tab.
过滤示例
DATA(f1) = FILTER #( itab1 WHERE num >= 3 ).
DATA(f2) = FILTER #( itab1 EXCEPT WHERE num >= 3 ).
DATA(f3) = FILTER #( itab2 USING KEY sec_key WHERE num >= 4 ).
DATA(f4) = FILTER #( itab3 WHERE num = 3 ).
DATA(f5) = FILTER #( itab1 IN filter_tab WHERE num = table_line ).
f1
过滤出num >= 3
的记录。f2
排除num >= 3
的记录。f3
使用次键过滤出num >= 4
的记录。f4
过滤出num = 3
的记录(针对哈希表)。f5
使用过滤表filter_tab
过滤出num
在过滤表中的记录。
输出结果
START-OF-SELECTION.
cl_demo_output=>new()
->write( 'itab1:' )->write( itab1 )
->write( 'f1: 过滤 num >= 3' )->write( f1 )
->write( 'f2: 排除 num >= 3' )->write( f2 )
->write( 'f3: 使用次键过滤 num >= 4' )->write( f3 )
->write( 'f4: 使用哈希键过滤 num = 3' )->write( f4 )
->write( 'f5: 使用过滤表' )->write( f5 )
->display( ).
运行结果
运行上述代码后,输出将显示:
itab1
: 原始数据集。f1
: 过滤条件num >= 3
后的数据。f2
: 排除条件num >= 3
后的数据。f3
: 使用次键过滤num >= 4
后的数据。f4
: 使用哈希键过滤num = 3
后的数据。f5
: 使用过滤表filter_tab
后的数据。
这个示例展示了如何使用 FILTER
操作符在 ABAP 中进行复杂的数据过滤操作。