在 FOR EACH in Progress 4GL 中使用 MATCHES (* + "" + *) 和没有参数是否相同?

is it the same to use MATCHES (* + "" + *) and no parameters in a FOR EACH in Progress 4GL?

所以我为每个人做了以下

FOR EACH insp_cd
WHERE insp_cd.status_ = 1
AND insp_cd.item MATCHES('*' + pc-itemPost + '*')
AND insp_cd.update_at < NOW:

那么,当 pc-itemPost 为 "" 时,我应该避免使用 MATCHES 吗?喜欢:

IF pc-itemPost = "" THEN DO:
FOR EACH insp_cd
WHERE insp_cd.status_ = 1
AND insp_cd.update_at < NOW:
...
END.
ELSE DO:
FOR EACH insp_cd
WHERE insp_cd.status_ = 1
AND insp_cd.item MATCHES('*' + pc-itemPost + '*')
AND insp_cd.update_at < NOW:

我知道由于 table 扫描,它很慢,但我想知道是否有任何区别。谢谢

任何时候你都可以避免比赛,你应该这样做。

使用 IF 语句选择执行不同静态 FOR EACH 语句的分支是一种方法。基于类似逻辑构建动态查询将是另一种方法。

您的两个查询是否“不同”?当然,它们是不同的。它们有不同的 WHERE 子句,因此它们的具体行为(和性能)将取决于索引结构(我们不知道)。

insp_cd.item matches “*” + pc-itempost + “*”

可以非常不同于:

insp_cd.item = “”.

从逻辑上讲,这与完全忽略 insp_cd.item 的检查不同。从逻辑上讲,也许您正试图排除空值?我不确定这里的要求是什么。

如果 insp_cd.item 是索引的第一个组成部分,或者 insp_cd.Status 之后的第二个组成部分,那么使用 '= “” ' 的此查询的变体将比使用 MATCHES 的查询更有效.

回到避免 MATCHES 的高度:

  1. 如果不需要通配符使用“=”。始终首选相等匹配。

  2. 如果通配符在字符串末尾使用 BEGINS。

  3. 如果使用通配符表示已知列表,请使用一系列 OR 子句或 LOOKUP() 或构建临时 table 以加入查询。

可能有更多方法可以避免 MATCHES,但这些是 spring 需要注意的方法。