7
votes

Conditionnel où des clauses dans des jasperReports

Disons que je veux un JasperReport qui permet à l'utilisateur de filtrer à une date si elle le souhaite. Le SQL est le suivant:

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


1 commentaires

Dans mon cas, le deuxième paramètre était une chaîne et la partie de la clause où j'ai utilisé $ p {strivalue}.


3 Réponses :


6
votes

Avant d'avoir utilisé le $ p! {} expression Le pilote JDBC effectue toutes la mise en forme de votre formatage pour vous.

Mais si vous utilisez le $ p! {} Expression Vous devez vous formater vous-même.

Quelque chose comme ça devrait fonctionner: xxx

en fonction de votre type de données, vous devez personnaliser dd. Mm.yyyy HH: mm: Ss.ssss .

Si vous ne voulez pas utiliser la $ p! {} expression, vous pouvez l'éviter avec le Solution ci-dessous.

je n'aime personnellement pas de cette façon. Il peut également causer un mauvais plan d'exécution.

si vous ne voulez pas utiliser $ p! {} parce que vous vous inquiétez d'injection SQL. Il est inutile que votre paramètre $ p {quelque.date} contient un type de données sécurisé comme java.lang.date .


Créer un paramètre. Appelons-le $ {is_null_pram} et ajoutez une expression par défaut avec param param [code> integer : xxx

Vous pouvez maintenant interroger : xxx


2 commentaires

Aucune de ces solutions n'est ce que je voudrais comme une solution idéale. Je souhaite que le paramètre NULL modifie le SQL étant exécuté, mais je souhaite également que le pilote JDBC paramètree. Je déteste comprendre le formatage de la date, etc. Les deuxièmes options semblent mieux cependant, et j'ai fait des tests avec le plan d'affichage / expliquer et les bases de données et les bases de données de manière appropriée en ignorant le prédicat s'il y a une condition réelle de 1 = 1.


Juste un fyi à quiconque qui le voit. Avoir is_null_param être un entier que vous vous comparez à un autre 1. La comparaison des chaînes ne peut également être optimisée par certaines des bases de données.



1
votes

Je pense que vous pouvez utiliser la fonction:

$ x {égal, , }

Il optimise la requête que vous pouvez voir dans Cette page d'aide .


0 commentaires

0
votes

Vous pouvez utiliser cette instruction conditionnelle

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


0 commentaires