Remy 的答案可能会重新表述为单个查询。如果您准备一次然后重新打开多次,这可能会更好。
select * from clients where (clientid = :clientid)
and (:clientid is not null)
UNION ALL
select * from clients where (:clientid is null)
这只是将两个不同的查询(具有相同的结果向量)聚合在一起。条件只是关闭其中一个。使用会是这样的:
DBComp.Prepare.
...
DBComp.Close;
DBComp.ParamByName('clientid').Value := clientid;
DBComp.Open;
...
DBComp.Close;
DBComp.ParamByName('clientid').Clear;
DBComp.Open;
但是,此查询将依赖 SQL Server优化器功能来提取查询不变量(:clientid 为 [not] null)并完全启用/禁用查询。但是,您的原始查询也取决于此。
为什么仍然使用过时的 FB 1.5 ?FB 2.5.2 在那里工作不会更好吗?我认为您的原始查询表述不佳。
select * from clients where (:clientid = -1) or ((clientid = :clientid) and (:clientid <> -1))
在 SQL Server 优化器上可能会更容易。但我认为 FB 可以在那里做得更好。稍后尝试下载 FB,并使用 IBExpert 或 FlameRobin 等 IDE 在其中运行您的查询。重新排列括号并将 -1 更改为 NULL 是显而易见的尝试。
现在使用 BDE 很脆弱。它不是很快,限制了数据类型和连接性(例如没有 FB/IB 事件)。并且会出现与 Vista/Win7 和 Win64 的各种兼容性问题。如果 FB/IB 是您选择的服务器,请考虑切换到一些现代组件集:
显示表格和索引的定义以及这些索引的选择性也是一件好事。