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



我使用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>

我该怎么做?

感谢

你走在了正确的道路上。我认为您只是在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>

最新更新