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() + "'"
3 Réponses :
Avant d'avoir utilisé le Mais si vous utilisez le Quelque chose comme ça devrait fonctionner: p> en fonction de votre type de données, vous devez personnaliser Si vous ne voulez pas utiliser la je n'aime personnellement pas de cette façon. Il peut également causer un mauvais plan d'exécution. Em> p> si vous ne voulez pas utiliser Créer un paramètre. Appelons-le Vous pouvez maintenant interroger : p> $ p! {} code> expression Le pilote JDBC effectue toutes la mise en forme de votre formatage pour vous.
$ p! {} code > Expression Vous devez vous formater vous-même. P>
dd. Mm.yyyy HH: mm: Ss.ssss code>. P>
$ p! {} Code> expression, vous pouvez l'éviter avec le Solution ci-dessous. P>
$ p! {} Code> parce que vous vous inquiétez d'injection SQL. Il est inutile que votre paramètre
$ p {quelque.date} code> contient un type de données sécurisé comme
java.lang.date code>. P>
$ {is_null_pram} code> et ajoutez une expression par défaut avec param param [code> integer code>: p>
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 code> ê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.
Je pense que vous pouvez utiliser la fonction: p>
Il optimise la requête que vous pouvez voir dans Cette page d'aide . p> $ x {égal,
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
Dans mon cas, le deuxième paramètre était une chaîne et la partie de la clause où j'ai utilisé $ p {strivalue}.