我正在将一些SQL代码转换为Progress 4GL。我现在写的特定代码有很多可能的变量插入,例如,有3个复选框可以选择是或不是,每个选择都会添加一个";"AND 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部分。有可能吗?
是的,可以做到这一点(正如nwahmaet所展示的那样(。
但是,在一个非琐碎的查询中,这是一个非常非常糟糕的想法。您很可能会强制进行表扫描,并且很可能会将所有数据发送给客户端进行选择。这将是非常痛苦的。最好将IF THEN ELSE移到WHERE子句之外,并实现两个不同的FOR EACH语句。
如果您担心的是要复制FOR EACH的主体,那么您可以使用查询。类似这样的东西:
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子句构建为字符串,但这涉及到使用句柄,而且更为复杂。但如果这听起来很有吸引力,请在文档中查找QUERY-PREPARE。
您可以在FOR EACH中添加IF
语句。你必须有完整的IF。。。然后。。。ELSE。
例如:
FOR EACH customer WHERE (IF discount > 50 THEN state = 'ma' ELSE state = ''):
DISPL name state discount.
END.
也就是说,该条件不会用于索引选择,只会应用于客户端(如果您使用的是网络数据库连接,这很糟糕(。