【问题标题】:JasperReports: How to add a WHERE statement in SQL query depending on a Boolean parameter?JasperReports:如何根据布尔参数在 SQL 查询中添加 WHERE 语句?
【发布时间】:2012-10-15 03:46:31
【问题描述】:

如果我的布尔参数在 JasperReports 中为真,我如何在 SQL 中添加 sub where 语句?
例如,我的 SQL 如下:

SELECT * FROM shops WHERE region = "Canada" ORDER BY name

如果我的参数为真,我想在 ORDER BY 之前添加 and isactive = 'Y'
有谁知道我怎么能做到这一点?

【问题讨论】:

    标签: sql parameters jasper-reports where


    【解决方案1】:

    您可以添加附加参数来设置附加条款值。之后,您可以在查询中使用$P!{} 语法。

    样本:

    <parameter name="param" class="java.lang.Boolean"/>
    <parameter name="whereCond" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA[$P{param} ? " AND isactive='Y'" : ""]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[SELECT * FROM shops WHERE region='Canada' $P!{whereCond} ORDER BY name]]>
    </queryString>
    

    【讨论】:

    • 非常感谢。这样可行。问题是由于!对于在执行查询之前编译的参数。
    【解决方案2】:

    您可以直接在 SQL 中执行此操作

    SELECT * FROM shops WHERE region = "Canada"
    AND (@param <> `True` OR isActive = 'Y')
    -----^^^^^^^^^^^^^^^^--<< Condition: Your param is not true------
    ORDER BY name
    

    【讨论】:

    • 嗨@hims056,我试过AND ($P{param} &lt;&gt; 'True' OR isActive = 'Y')我也试过@,都返回错误“执行SQL语句错误”
    • 它将超过允许的最大字符数。我只是粘贴 where 子句,然后将参数 (ExcludeClosedShops) 更改为带有 Y 或 N 的字符串。where pos.ad_client_id = $P{CLIENT} and pos.ad_org_id in ($P!{ORG}) and pos.m_brand_id in ($P!{BRAND}) and pos.c_activity_id in ($P!{ACTIVITY}) and pos.c_salesregion_id in ($P!{REGION}) AND ($P{ExcludeClosedShops}.equals("N") OR pos.isActive = 'Y') and cash.isposorder = 'Y' AND STATEMENTDATE BETWEEN $P{STARTDATE} and $P{ENDDATE} 顺便说一句,sql 在没有额外的“AND”的情况下运行良好
    • 和参数定义如下:
    • 我自己试过的是$P{ExcludeClosedShops}.equals("Y") ? "and pos.isactive='Y'" : " ",但也没用。
    【解决方案3】:

    试试这个

    select * from shops where region = "Canada"
    AND isActive = CASE WHEN @var = 'True' then 'Y' ELSE isActive END
    order by name
    

    【讨论】:

    • 您好,感谢您的快速回复。我试过但没有用。据我了解您的代码,如果我的参数(例如 $P{param1})为 false,它将是 AND isActive = isActive
    • @user1745968 是的,如果参数为假,它将是AND isActive = isActive,你得到什么错误?
    • 错误是“执行 SQL 语句”错误。如果参数为假,我想要的没有任何改变。
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 2011-05-30
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多