听起来您想偶尔搜索参数中 4 个条件中的一到三个条件的记录。
有几种方法可以做到这一点:
一种方法是使用like,并将默认参数值设置为%,即通配符。当参数运行时,它返回所有值。请注意,如果字段包含 null,这可能会出现问题。
or f4 like ?
所以你需要使用类似于下面的东西来返回空值。
or (f4 is null
or f4 like ?)
我通常更喜欢使用“All”作为我的默认参数值,正如您在第二个“and”中看到的那样,我们查看参数值是否为 All,如果是返回 PRODUCTTYPEM1.CATEGORY 的所有值,如果是其他任何内容,它会在 PRODUCTTYPEM1.CATEGORY 字段中查找输入的值。
where PRODUCTTYPEM1.ACTIVE = 't'
and DEVICE2M1.ISTATUS = 'In Use'
and ( 'All' = ?
or PRODUCTTYPEM1.CATEGORY = ?)
为此,您需要两个参数条目,第一个用于 All,第二个用于除 All 之外的任何值。
我在报告中只有一个 Category 参数,如果参数值不是 All,则第二个条目会再次查看相同的参数
这是如何工作的。 (根据要求扩展解释)
打开 where 语句,以及“使用中”的简单第二个条件
where PRODUCTTYPEM1.ACTIVE = 't'
and DEVICE2M1.ISTATUS = 'In Use'
第三个条件是括号中设置的两部分,用 OR 语句分隔两部分
and ( 'All' = ?
or PRODUCTTYPEM1.CATEGORY = ?)
如果参数的值为All,则满足语句的第一部分,并且查询跳过括号中的所有其他内容。就像你的 SQL 查询中根本没有参数一样。
如果参数的值为NOT all,则不满足语句的第一部分,因此查询在字段 PRODUCTTYPEM1.CATEGORY 中查找参数值。
您的最终查询可能看起来像这样,虽然我们的默认日期为“全部”是有问题的,但您可能希望使用某种日期作为默认值,例如 1900 年 1 月 1 日。
select f1,f2,f3,f4
where f3 in (''/*?listparam*/)
AND ( 'All' = ?
OR f1 >= ?) -- startdate parameter
AND ( 'All' = ?
OR f2 <= ?) -- endate paramter
AND ( 'All' = ?
OR f4 = ?) -- stringparam