仕事でプログラミングをしているときに、友人が非常に興味深い事例を紹介してくれました。「 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 ステートメントまたは純粋なコードで実装できるかどうかを知りたいです。