在 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 的高度:
如果不需要通配符使用“=”。始终首选相等匹配。
如果通配符在字符串末尾使用 BEGINS。
如果使用通配符表示已知列表,请使用一系列 OR 子句或 LOOKUP() 或构建临时 table 以加入查询。
可能有更多方法可以避免 MATCHES,但这些是 spring 需要注意的方法。
所以我为每个人做了以下
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 的高度:
如果不需要通配符使用“=”。始终首选相等匹配。
如果通配符在字符串末尾使用 BEGINS。
如果使用通配符表示已知列表,请使用一系列 OR 子句或 LOOKUP() 或构建临时 table 以加入查询。
可能有更多方法可以避免 MATCHES,但这些是 spring 需要注意的方法。