当前位置: 首页 > 面试题库 >

JasperReports中的条件Where子句

盖泽宇
2023-03-14
问题内容

假设我想要一个JasperReport,它可以让用户根据需要过滤日期。SQL如下:

select * from foo where bar = $P{bar} and some_date > $P{some.date}

现在,如果他们没有传递日期,我不想按某个日期进行过滤。我发现了人们使用的以下错误信息:

select * from foo where bar = $P{bar} $P!{some.date.fragment}

some.date.fragment使用以下默认值定义参数:

($P{some.date} == null || $P{some.date}.equals("")) ? "" : "AND some_date >'" + new java.sql.Date($P{some.date}.getTime()).toString() + "'"

这无法正常工作,因为toString不会以我的SQL
Server可以理解的格式输出日期。我想让条件条件仍然与jdbc驱动程序一起使用一条准备好的语句,并将参数扔进去,我只希望准备好的语句依赖于该参数是否为null。能做到吗?


问题答案:

在使用$P!{}表达式之前,JDBC-Driver会为您进行所有格式化。

但是,如果使用$P!{}表达式,则必须格式化自己。

这样的事情应该起作用:

(
$P{some.date} == null 
? 
"" 
: 
"AND some_date >'" + (new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS")).format($P{some.date}) + "'"
)

根据您的数据类型,您必须自定义dd.MM.yyyy HH:mm:ss.SSS

如果您不想使用该$P!{}表达式,则可以使用以下解决方案来避免使用它。

我个人不喜欢这种方式。 这也可能导致执行计划不正确。

如果不想使用,$P!{}因为您担心sql注入。只要您的参数$P{some.date}包含类似的安全数据类型,就不需要使用java.lang.Date

创建一个参数。让我们调用它${is_null_pram}并添加一个带有param class的默认表达式Integer

($P{some.date} == null ? 1 : 0)

现在您可以查询:

SELECT 
    * 
FROM foo 
WHERE
    bar = $P{bar}
    AND
        (
            some_date > $P{some.date}
            OR 1 = $P{is_null_pram}
        )


 类似资料:
  • 问题内容: 我正在创建一个需要条件子句的SQL查询。 应该是这样的: 上面的查询不起作用。这是不正确的语法,还是我不知道的另一种方式来做到这一点? 我不想使用动态SQL,是否还有其他方法,还是必须使用类似的解决方法,例如对不同的子句使用和使用相同的查询? 问题答案: 试试这个 您可以在此处阅读有关条件WHERE的更多信息。

  • 我想对group by子句和where子句使用hibernate标准。 就像我有一个sql这样: 在使用标准组BY时,我如何在hibernate投影中传递截断的日期。

  • 问题内容: 我有一个执行查询的SQL Server 2005存储过程。该存储过程采用三个参数。参数如下: @StateID为int, @ CountyID为int, @ CityID为int 这些参数用于查询客户列表。如果参数值不为null,我基本上想做一个“ AND”。但是,我目前无法执行if- else。如果参数值不为null,如何添加这些子句。换一种说法: 问题答案: 加上一些OR语句: 对

  • 问题内容: 我目前有一个查询,它将根据我想使用的任何条件从数据库中提取一堆信息。 如果参数=’‘,我希望能够删除注释部分并仅显示所有行 例如,如果我使用它,它将按该参数搜索,如果我使用它,将按该参数搜索。 我已经尝试使用以下方法和其他一些尝试,但是进展并不很快。 问题答案: 您可能需要考虑构建查询。

  • 问题内容: 在此找到了两个类似的问题,但无法弄清楚如何应用于我的方案。 我的函数有一个名为 @IncludeBelow 的参数。值是0或1(BIT)。 我有这个查询: 如果@IncludeBelow为0,我需要查询如下: 如果@IncludeBelow为1,则最后一行需要排除。(即不应用过滤器)。 我猜想它必须是一条语句,但无法弄清楚语法。 这是我尝试过的: 显然,这是不正确的。 正确的语法是什么

  • 问题内容: 我今天输入了错误的查询,但它仍然有效,并给出了预期的结果。我的意思是运行此查询: 但是我不小心跑了这个查询 (请注意,而不是最后一个子句中的) 并且都从用户ID返回了正确的员工ID。 这两个查询有什么区别?第二种形式是否仅联接满足条件的2个表的成员,而第一种形式将联接整个表,然后运行查询?一个效率比另一个效率高吗?还有其他我想念的东西吗? 谢谢! 问题答案: 对于这样的内部联接,它们在