我正在将一些SQL代码转换为Advancement4GL。我现在正在编写的特定代码有很多可能的变量插入,例如,有3个复选框可以被选中,并且每个选择都添加了一个“和ind_sit_doc IN",等等。
我想做的是这样的事情:
FOR EACH doc-fiscal USE-INDEX dctfsc-09
WHERE doc-fiscal.dt-docto >= pd-data-1
AND doc-fiscal.dt-docto <= pd-data-2
AND doc-fiscal.cod-observa <> 4
AND doc-fiscal.tipo-nat <> 3
AND doc-fiscal.cd-situacao <> 06
AND doc-fiscal.cd-situacao <> 22
AND (IF pc-ind-sit-doc-1 = 'on' THEN: doc-fiscal.ind-sit-doc=1) NO-LOCK,
EACH natur-oper USE-INDEX natureza
WHERE doc-fiscal.nat-operacao = natur-oper.nat-operacao NO-LOCK:只有当变量以某种方式读取时,才会读取if部分。有可能吗?
发布于 2020-12-15 21:00:31
是的,您可以使用(大致如nwahmaet所示)。
但在一个非平凡的查询中,这是一个非常非常糟糕的想法。您很可能会强制进行表扫描,并且很可能会将所有数据发送到客户端进行选择。那会很痛苦的。最好将IF然后EACH移到WHERE子句之外,并为每个语句实现两个不同的语句。
如果您对此的关注是,您将重复每个查询的主体,那么您可以使用查询。就像这样:
define query q for customer.
if someCondition = true then
open query q for each customer no-lock where state = "ma".
else
open query q for each customer no-lock where state = "nh".
get first q.
do while available customer:
display custNum state.
get next q.
end.这将是,比一个小桌子更有效的。
您也可以完全动态地构建所需的WHERE子句作为字符串,但这涉及到使用句柄,而且更复杂。但是,如果这听起来很有吸引力,请在文档中准备查询。
发布于 2020-12-15 20:17:11
您可以将IF语句添加到“为每个语句”中。你必须有完整的如果..。然后..。不过还有别的事。
例如:
FOR EACH customer WHERE (IF discount > 50 THEN state = 'ma' ELSE state = ''):
DISPL name state discount.
END.尽管如此,该条件将不会用于索引选择,而只应用于客户端(如果您使用的是网络数据库连接,这是不好的)。
https://stackoverflow.com/questions/65312615
复制相似问题