在工作中编程时,一位朋友向我展示了一个非常有趣的案例:有一个带有通配符值的表,例如"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语句中还是在纯代码中。
这可能是一个更好的方法,具体取决于您希望选择的条目数量。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通配符(%
和_
,而不是*
和+
)的条目列表。如果没有,则需要在循环的开头添加必要的格式。
此外,如果只关心t_wildcard
而不关心t_text
,则数据库访问可以是select single
,从而进一步降低负载。