正在进行的动态查询4GL



我必须创建一个查询,人们可以在其中输入一些值或不。如果他们不输入密码,程序就会搜索所有信息。人们可以只放入代码的一部分数据。我的代码是这样的:

cQuery = "" +
" FOR EACH table1 " +
" WHERE table1.status_ = 1 " +
" AND table1.section MATCHES " + QUOTER("*"+ pc-section + "*").

我的问题是。1 -我读了很多match使用表扫描,我们应该避免它,所以我想把match放在if变量中。真的有必要吗?2 - QUOTER(">"+ pc-section + ">")是在动态查询中使用MATCHES的正确方式吗?我的结果似乎是错误的,我不知道这是因为match还是我的代码中有其他问题。

抱歉有任何错误的想法,谢谢你的时间。

编辑:我的IF语句是这样的:

DEF VAR ifSection AS CHAR.
IF pc-section <> "" THEN ifSection = " AND table1.section MATCHES " + QUOTER("*"+ pc-section + "*").

在我的代码中我使用:

" FOR EACH table1 " +
" WHERE table1.status_ = 1 " + ifSection.

我现在设法使它工作。在我的结果的问题是因为我忘记添加"ifSection"之后,然后。但我仍然不确定这是否是最好的方法。在动态查询中是否有其他更好的方法来使用MATCHES ?谢谢你的帮助

不要在WHERE子句中使用IF语句——你永远不会那样使用索引。

你可以把IF放在外面:

cQuery = " FOR EACH table1 WHERE table1.status_ = 1 ".
IF <something> THEN
// no index
cQuery = cQuery + " AND field-name MATCHES " + QUOTER("*"+ pc-section + "*").
ELSE
IF <something-else> THEN
// may be indexed
cQuery = cQuery + " AND field-name BEGINS " + QUOTER(pc-section).
ELSE
IF <something-else> THEN
// may be indexed
cQuery = cQuery + " AND field-name = " + input-value.

等,这将帮助您至少在可能的情况下尝试使用索引。

用索引搜索代替MATCHES更为复杂。你可以从单词索引和CONTAINS关键字开始。

最新更新