복붙노트

[SQL] 옵션 where 절 재스퍼 보고서

SQL

옵션 where 절 재스퍼 보고서

나는이 쿼리하지만 성공하지를 시도하고있다.

SELECT name, phone_office, billing_address_city, billing_address_street, billing_address_country 
FROM accounts
WHERE ($P!{EmployeeID} is null or assigned_user_id = $P!{EmployeeID})
ORDER BY billing_address_country, billing_address_city

이 URL은 직원 ID를 기준으로 필터링하고 잘 작동합니다 :

.../flow.html?_flowId=viewReportFlow&reportUnit=/reports/samples/EmployeeAccounts&EmployeeID=sarah_id

내가 어디에서 필터를 제거 할 매개 변수 그러나 때 나는 직원 ID를 제거합니다. 그래서 모든 결과가 표시되어야한다.

.../flow.html?_flowId=viewReportFlow&reportUnit=/reports/samples/EmployeeAccounts

내 질문은 어디에 SQL 쿼리에 옵션을 전달하는 올바른 방법이 무엇인지입니다.

해결법

  1. ==============================

    1.좋아, 샘플을 볼 수 있습니다.

    좋아, 샘플을 볼 수 있습니다.

    예를 들어 우리는 쿼리를 가지고 :

    SELECT id, city, street FROM address WHERE city=$P{inputParamCity} ORDER BY city
    

    그러나 우리의 inputParamCity은 정의되지 않은 될 수있다. 이 경우 우리는 오류가 발생했습니다 :

    Error filling print... Error preparing statement for executing the report query : 
    SELECT id, city, street FROM address WHERE city=? ORDER BY city
    

    우리는 어떻게 그것을 해결할 수 있습니까? 그것은 매우 간단합니다 - 우리는이 같은 기본 표현과 다른 매개 변수를 추가 할 수 있습니다 :

    <parameter name="whereClause" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA[()$P{inputParamCity} == null || $P{inputParamCity}.isEmpty()) ? "1=1" : "city='" + $P{inputParamCity} + "'"]]></defaultValueExpression>
    </parameter>
    

    inputParamCity 파라미터는 "위조"절 "1 = 1"정의되지 -if 도시 필드에 의해 상기 필터를 적용 할 다른 경우에 사용될 것이다.

    물론 우리는 쿼리 식을 수정해야와 -이 새로운 매개 변수를 사용합니다. 이 경우 우리의 쿼리 식는 다음과 같습니다

    <queryString>
        <![CDATA[SELECT id, city, street FROM address WHERE $P!{whereClause} ORDER BY city]]>
    </queryString>
    

    jrxml 파일 :

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="optional_where_clause" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="d3648644-0087-4dfc-ac6d-87e82d9bb33e">
        <parameter name="inputParamCity" class="java.lang.String"/>
        <parameter name="whereClause" class="java.lang.String" isForPrompting="false">
            <defaultValueExpression><![CDATA[($P{inputParamCity} == null || $P{inputParamCity}.isEmpty()) ? "1=1" : "city='" + $P{inputParamCity} + "'"]]></defaultValueExpression>
        </parameter>
        <queryString>
            <![CDATA[SELECT id, city, street FROM address WHERE $P!{whereClause} ORDER BY city]]>
        </queryString>
        <field name="ID" class="java.lang.Integer"/>
        <field name="CITY" class="java.lang.String"/>
        <field name="STREET" class="java.lang.String"/>
        <detail>
            <band height="20" splitType="Stretch">
                <textField>
                    <reportElement uuid="c2a80b99-e087-4839-8e77-841edd899255" x="0" y="0" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{ID}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement uuid="0aafcfd6-60f7-4272-8e7d-0aa77507204b" x="100" y="0" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{CITY}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement uuid="c8726513-8250-43ec-bafc-003e81094c27" x="200" y="0" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{STREET}]]></textFieldExpression>
                </textField>
            </band>
        </detail>
    </jasperReport>
    

    미정 inputParamCity 파라미터를 이용한 경우 (값이 설정되지 않은) 결과가 될 것이다 :

    이 경우 엔진에 의해 사용 된 쿼리는 다음과 같습니다

    SELECT id, city, street FROM address WHERE 1=1 ORDER BY city
    

    우리가 설정 한 경우, 예를 들어, 결과 매개 변수 inputParamCity의 값 시카고은 다음과 같습니다

    이 경우 엔진에 의해 사용 된 쿼리는 다음과 같습니다

    SELECT id, city, street FROM address WHERE city='Chicago' ORDER BY city
    

    노트:

  2. ==============================

    2.절을이 방법으로 수행 할 수 있습니다 어디는 선택 생각한다 -

    절을이 방법으로 수행 할 수 있습니다 어디는 선택 생각한다 -

      SELECT name, phone_office, 
              billing_address_city, billing_address_street,
              billing_address_country 
      FROM accounts
      WHERE (assigned_user_id = $P{EmployeeID} or $P{EmployeeID} is null)
      ORDER BY billing_address_country, billing_address_city
    

    이 상태에서는 where 절 조건을 적용하지 않고 당신에게 모든 값을 제공합니다 모든 직원의 ID를 전달하지 않는 경우.

  3. from https://stackoverflow.com/questions/19401825/optional-where-clause-jasper-reports by cc-by-sa and MIT license