动态SELECT查询,它决定是否使用Mule 4中的WHERE子句

时间:2018-07-18 09:33:27

标签: mule anypoint-studio dataweave

我正在使用Mule 4和Anypoint 7,并希望设置数据库连接器以从我的SQL Server数据库表中选择所有客户,但是如果在请求中填充了customerName查询参数,那么我想添加WHERE子句以仅返回与customerName查询参数同名的客户,否则它应该只返回所有客户。

我的代码在下面,但是我在努力使语法正确。

<db:select doc:name="Select Customers" doc:id="98a4aa2f-b0b6-4fb5-ab27-d70489fd532d" config-ref="db-config">
    <ee:repeatable-file-store-iterable />
    <db:sql >SELECT TOP 10 * FROM MYDB.dbo.Customer $(if (attributes.queryParams.customerName != null and isEmpty(attributes.queryParams.customerName) == false) &quot;WHERE Name = :customerName&quot; else &quot;&quot;)</db:sql>
    <db:input-parameters ><![CDATA[#[{'customerName' : attributes.queryParams.customerName}]]]></db:input-parameters>
</db:select>

我该怎么做?

谢谢

1 个答案:

答案 0 :(得分:0)

您在正确的道路上。我认为您只是在db:sql元素中缺少有关SQL的评估标签。

<db:select doc:name="Select Customers" doc:id="98a4aa2f-b0b6-4fb5-ab27-d70489fd532d"
    config-ref="db-config">
    <ee:repeatable-file-store-iterable />
    <db:sql>#["SELECT TOP 10 * FROM MYDB.dbo.Customer 
         $(if (isEmpty(attributes.queryParams.customerName) == false) &quot;WHERE Name = :customerName&quot; else &quot;&quot;) "]</db:sql>
    <db:input-parameters ><![CDATA[#[{'customerName' : attributes.queryParams.customerName}]]]></db:input-parameters>
</db:select>

使用变量调试这样的事情更加容易,这样您就可以看到各个值。 FWIW继承了我的测试代码:

<set-variable variableName="additionalWhereClause" 
    value='#[if ( isEmpty(attributes.queryParams.email) == false) 
                 "WHERE Email = :emailParm" 
             else "" ]' />

<set-variable variableName="selectSql" 
    value="#['SELECT FirstName, LastName, Email     
              FROM User   
              $( vars.additionalWhereClause )  
              ORDER BY Email LIMIT 10']" />

<logger level="INFO" message="queryParams: #[attributes.queryParams]" doc:id="96c62f84-2c98-4df6-829c-e00c9fcec9ca" />
<logger level="INFO" message="additionalWhereClause #[vars.additionalWhereClause]" doc:id="0d3611b4-34ae-4ebb-b931-6d31ce3804c1" />
<logger level="INFO" message="selectSql #[vars.selectSql]" doc:id="5c56342d-9674-4891-9d7e-bb32319f4ad0" />

<db:select doc:name="MySQL Query" doc:id="e60be3e6-9b51-4b3b-9dfa-4ee0af65cb03"
    config-ref="mysql-config">
    <ee:repeatable-file-store-iterable />
    <db:sql>#[ vars.selectSql ]</db:sql>
    <db:input-parameters><![CDATA[#[{'emailParm' : attributes.queryParams.email}]]]></db:input-parameters>
</db:select>