ABAP: SQL 多值查询

本文介绍了在SAPABAP编程中,如何优化查询物料类型为ZFRT、ZROH和ZRSA的物料编码,比较了直接使用OR和IN列表、定义区间结构以及使用VALUE#()函数的不同方法,推荐使用IN列表和VALUE#()以提高代码效率。
摘要由CSDN通过智能技术生成

基础查数据

问题举例:例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。

1、直接查询,三种不同类型的物料类型是或的关系。

  SELECT DISTINCT ma~matnr  ma~mtart
   FROM mara AS ma
  INNER JOIN mbewh AS mb
    ON ma~matnr = mb~matnr
  INTO CORRESPONDING FIELDS OF TABLE gt_tab
  WHERE ma~mtart EQ 'ZFRT' OR
        ma~mtart EQ 'ZROH' OR
        ma~mtart EQ 'ZRSA'.

2、如果对1进行优化,三种物料类型放在列表项中,使用关键字IN,这样查询等价于1.

  SELECT DISTINCT ma~matnr  ma~mtart
   FROM mara AS ma
  INNER JOIN mbewh AS mb
    ON ma~matnr = mb~matnr
  INTO CORRESPONDING FIELDS OF TABLE gt_tab
  WHERE ma~mtart IN ( 'ZFRT' , 'ZROH', 'ZRSA' ).

3、定义区间函数,RANGE 内表

https://www.cnblogs.com/buduzhiren/p/13131483.html

SAP ABAP编程 Ranges用法_m15188153014的博客-CSDN博客

定义区间结构:

 TYPES: BEGIN OF ty_sign,
           sign   TYPE sign,
           option TYPE option,
           low    TYPE mtart,
           high   TYPE mtart,
         END OF ty_sign.           "定义区间结构


(1)直接赋值,不建议这种直接堆叠赋值方式,代码量比较多。


  DATA: lt_mtart TYPE TABLE OF ty_sign WITH HEADER LINE.  "定义区间表
  
  lt_mtart-sign = 'I'.    "赋值
  lt_mtart-option = 'EQ'.
  lt_mtart-low = 'ZFRT'.
  APPEND lt_mtart TO lt_mtart.
  lt_mtart-sign = 'I'.
  lt_mtart-option = 'EQ'.
  lt_mtart-low = 'ZROH'.
  APPEND lt_mtart TO lt_mtart.
  lt_mtart-sign = 'I'.
  lt_mtart-option = 'EQ'.
  lt_mtart-low = 'ZRSA'.
  APPEND lt_mtart TO lt_mtart.
  CLEAR lt_mtart.

(2) 优化:使用VALUE#() 进行赋值,建议这种方式,代码量会大大减少。

  DATA: lt_mtart TYPE TABLE OF ty_sign .

 lt_mtart = VALUE #( sign = 'I' option = 'EQ'  ( low = 'ZFRT' high = '' )
                                               ( low = 'ZROH' high = '' )
                                               ( low = 'ZRSA' high = '' )
                    ).

(3)或者用APPEND VALUE#() TO ITAB. 与(2)二者等同。

DATA: lt_mtart TYPE TABLE OF ty_sign . 

APPEND  VALUE #( sign = 'I' option = 'EQ'  low = 'ZFRT' high = '' ) TO lt_mtart.
APPEND  VALUE #( sign = 'I' option = 'EQ'  low = 'ZROH' high = '' ) TO lt_mtart.
APPEND  VALUE #( sign = 'I' option = 'EQ'  low = 'ZRSA' high = '' ) TO lt_mtart.

对RANGE内表 赋值完成后的,以上三种方式的查询语句均相同。

  SELECT DISTINCT ma~matnr  ma~mtart
  FROM mara AS ma
  INNER JOIN mbewh AS mb
    ON ma~matnr = mb~matnr
  INTO CORRESPONDING FIELDS OF TABLE gt_tab
  WHERE ma~mtart IN lt_mtart.

总结: 1、如果是多个字符,使用第二种,IN +列表项,查询最为简洁;

2、如果有多个区间,可以使用VALUE#()方式进行赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值