5

ABAP でこの SELECT ステートメントを使用しようとしています。

  SELECT DISTINCT * FROM  dbtab
     INTO CORRESPONDING FIELDS OF TABLE itab
     WHERE  field1+7(16)  IN s_field1
     AND    field2        IN s_field2.

しかし、dbtab 列にオフセットを使用することはできません。どうすればこの問題を解決できますか?

私はループのようなものを避けようとしています

  SELECT DISTINCT * FROM  dbtab
     WHERE  field2        IN s_field2.
       IF field1+7(16)  IN s_field1
           ...
       endif.
  endselect.
4

2 に答える 2

6

OPEN SQL ではオフセットを使用できません。

SELECT を内部テーブルにして、このようにループすることをお勧めします。

SELECT DISTINCT * FROM dbtab
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE field2 IN s_field2.

LOOP AT dbtab into wa_itab.
  IF wa_itab-field1+7(16) IN s_field1
    ...
  ENDIF.
ENDLOOP.

一方、内部テーブルを SORTED または HASHED として定義するか、比較を行っているフィールドで itab を SORT したい場合も定義します。フィールドシンボルも代替手段になる可能性があります。

それが役に立てば幸い。

于 2016-01-15T16:58:33.493 に答える
1

ポリシーで許可されている場合は、おそらく代わりに EXECUTE_SQL ブロックを使用できます。たとえば、Oracle バックエンドがある場合は、OPEN SQL だけでなくネイティブ SQL 構造を利用できます。これが正当化されるかどうかは、パフォーマンスの向上に応じて判断が必要です。多分無いと思います。

LIKE 句を使用することもできます。これは、オフセットを正確に知るほど効率的ではありませんが、各オプションを % でカプセル化できます。WHERE field 1 LIKE '%search_partial%' OR field1 LIKE ...

これのユースケースは何ですか。コンテキストがあれば、より適切なオプションがあるかもしれません。

于 2016-01-16T00:41:55.143 に答える