使用 MATCHES (* + "" + *) 并且 FOR EACH in Progress 4GL 中没有参数是不是相同?
Posted
技术标签:
【中文标题】使用 MATCHES (* + "" + *) 并且 FOR EACH in Progress 4GL 中没有参数是不是相同?【英文标题】:is it the same to use MATCHES (* + "" + *) and no parameters in a FOR EACH in Progress 4GL?使用 MATCHES (* + "" + *) 并且 FOR EACH in Progress 4GL 中没有参数是否相同? 【发布时间】:2022-01-10 03:27:56 【问题描述】:所以我为每个人做了以下
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:
由于表扫描,我知道它很慢,但我想知道是否有任何区别。谢谢。
【问题讨论】:
【参考方案1】:只要您可以避免 MATCHES,您就应该这样做。
使用 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() 或构建临时表以加入查询。
可能有更多的方法可以避免 MATCHES,但这些都是我想到的。
【讨论】:
谢谢。那正是我所想。我总是避免使用 MATCHES,但我的同事一直在使用它们,当我不得不更改他们的代码时,我一直想知道当我更换 MATCHES 时我是否在做额外的工作。另一个问题是,我应该使用:WHERE insp_cd.status_ = 1 AND IF pc-itemPost <> "" THEN insp_cd.item MATCHES('*' + pc-itemPost + '*')
ELSE 1 = 1以上是关于使用 MATCHES (* + "" + *) 并且 FOR EACH in Progress 4GL 中没有参数是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章
简要介绍C#中正则表达式Regex的match和matches方法
JAVA正则表达式,matcher.find和 matcher.matches的区别
解决error C2664: no instance of constructor "CFileDialog::CFileDialog" matches the list