1

仕事でプログラミングをしているときに、友人が非常に興味深い事例を紹介してくれました。「 test 」などのワイルドカード値を含むテーブルがあります。このレジスタは'test'、単語の前後に何があるかは問題にならないため、それらに含まれる単語を見つけることができます。

たとえば、目的のテキストを含むレジスタを保持する別のテーブルがあります'this is a test'

通常のアクセス設定は、ワイルドカード テーブルからテキスト テーブルへのアクセスですが、これは私の友人のシナリオでは不可能です。

彼は実際に解決策を持ってきましたが、それが可能な限り良いとは感じていません.

彼のアイデアは、すべてのワイルドカード レジスタと必要なすべてのテキストを選択することでした。次に、ワイルド カード テーブルから、一致するターゲットがテキスト テーブルにないすべてのレジスタを削除します。これは、既に正しく、適切な値のみが含まれているためです。

ABAP では、これは次のように記述できます。

data: 
     wa_wildcard   type          string,
     t_wildcards   type table of string,
     t_texts       type table of string,
     wa_text       type          string,
     lv_index      type          sy-tabix,
     lv_found      type          c.

select * from zt_texts into table t_texts. "Retrieves desired texts.
check sy-subrc is initial.

select * from zt_wildcards into table t_wildcards. "Retrieves all widlcards.
check sy-subrc is initial.

loop at t_wildcards into wa_wildcard. "Checks every Wildcard
  move lv_index to sy-tabix. "Stores the iteration index for Wildcard table.

  loop at t_texts into wa_text. "Checks if the actual wildcard matches any text retrieved.
    if wa_text cp wa_wildcard-value. "If text contain parts of the wildcard string, it matches
      move 'X' to lv_found. "Found a match, may exit the loop!
      exit.
    endif.
  endloop.

  if lv_found ne 'X'.
    delete t_wildcards index lv_index. "removes the wildcard if no match was found.
  endif.
endloop.

これはABAPで行われるため、ワイルドカードテーブルが大きすぎてすべてを選択し、繰り返し、処理できない可能性があるため、この検証プロセスをデータベースに直接実行できるselectステートメントがあると思いました。

編集: 一般的なアイデアは、テキストを使用して、テキストごとにすべてのワイルドカードをテストせずに、適切なワイルドカードを見つけることです。これがデータベース指向のソリューション、つまり select ステートメントまたは純粋なコードで実装できるかどうかを知りたいです。

4

1 に答える 1

0

選択するエントリの数によっては、これがより適切な方法になる可能性があります。ZTEXTのエントリと同じ数のデータベース アクセスが必要ですZWILDCARDが、それが少ない場合は負荷が軽減されます。

select * from zwildcard into t_wildcards.

loop at t_wildcards into  wa_wildcard.
  select * from ztext appending table t_texts
    where value LIKE wa_wildcard.
  if sy-subrc is not initial.
    delete t_wildcards index sy-index.
  endif.
endloop.

これは、いずれかの側にSQL ワイルドカード ( and 、 not and )ZWILDCARDを持つエントリのリストがあることを前提としています。そうでない場合は、ループの先頭に必要な書式を追加する必要があります。%_*+

またt_wildcard、. t_text_select single

于 2013-06-29T22:35:58.783 に答える