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 语句能够直接在数据库中执行此验证过程,因为通配符表可能太大而无法选择所有内容、迭代和处理。

编辑:一般的想法是使用文本为其找到合适的通配符,而不用每个文本测试每个通配符。我想知道这是否可以在任何解决方案中实现,无论是面向数据库的,即在选择语句中还是在纯代码中。

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.

这是假设在任何一侧ZWILDCARD都有一个带有 SQL 通配符(%and _, not *and )的条目列表。+如果没有,您需要在循环的开头添加必要的格式。

此外,如果您只关心t_wildcard而不关心t_text,则数据库访问可能是select single,进一步减少负载。

于 2013-06-29T22:35:58.783 回答