0

我的报告接受以下两个值之一:

  1. 表示 ALL 的字符串“*”,或
  2. 表示人的 ID 的整数

所以,基本上,我有一个查询:

SELECT * FROM people where personid = ?

如果我传入一个整数,报告会完美运行,但如果我传入一个 * 表示全部,它就会中断。此外,如果我保持原样并传入一个字符串,则查询没有意义。即这有效:

SELECT * FROM people where personid = 5

但这不会:

SELECT * FROM people where personid = *
  1. 如果传入参数,我该如何重写它以便返回“all”?即如果值为*,它可以完全忽略where子句,但如果值为整数,它必须执行where子句。

目前,如果收到错误:

我可以将 * 改为 -1。因此,另一种方法是重写 sql,以便在传入 -1 时忽略约束。像这样:

SELECT * FROM people WHERE (param = -1 OR (param != -1 AND personid = param) )

..但这似乎不起作用?

4

4 回答 4

2

您需要传入两个参数(它们可以具有相同的值,除非您想使用*,因为这不是有效的整数值)并使用条件:

SELECT * FROM people where CAST(? AS VARCHAR(20)) = '*' OR personid = ?

第一个决定是选择所有内容(如果值为 *),还是选择特定的人(如果值为其他)。由于 Firebird 只支持位置参数,所以需要使用两个参数,但可以给它们相同的值(只有当值是数字时,当使用 时*,另一个参数应该是简单的数字)。请注意,强制转换是确保 Firebird 正确解释参数所必需的。

如果这变得太慢(因为优化器可能不喜欢这样),你应该考虑使用UNION

SELECT * FROM people where personid = ?
UNION
SELECT * FROM people where CAST(? AS VARCHAR(20)) = '*'
于 2013-05-31T08:13:35.910 回答
0

我使用不同的技术

String q="SELECT * FROM people where 1=1";
if PersonId>0 {
  q=q+" and personid="+PersonId.toString();
}
于 2013-05-31T06:41:58.050 回答
0

那这个呢

SELECT * FROM people WHERE (personid = param OR ( param = -1  ))
于 2013-05-31T08:56:33.750 回答
0

当我在 BIRT 中将通配符传递给 SQL 时,我使用 % 并且没有问题

首先检查它是否是您查询中的有效通配符

如果这有效

 SELECT * FROM people where personid = %

然后使用

 SELECT * FROM people where personid = ?

如果您为用户参数界面使用文本框,请将默认值设置为 %

别的

将“全部”值设置为 %

于 2013-05-31T11:30:57.063 回答