0

我有

QueryExecute(

    SELECT *
    FROM dbo.pages
    WHERE ID IN ( :id )
    ...
   ,
   {
       id : { value = rc.id, cfsqltype : "cf_sql_integer, list : true }
   }

几乎所有时间这都有效。事情rc.id可以是空白的。如果为空,则应匹配所有 ID。我被困在如何做到这一点

4

2 回答 2

3

这里有两种不同的选择。

1)当变量不为空时,您可以操作查询字符串以仅包含 IN 语句。

你如何去做真的取决于查询的其余部分以及你想如何做到这一点。

<cfset sqlstr = "SELECT * FROM dbo.pages" />
<cfif len(rc.id)>
    <cfset sqlstr &= " WHERE ID IN ( :id )" />
</cfif>

您可以使用条件输出更干净地构建......

WHERE #len(rc.id) ? "ID IN ( :id )" : ""#

为了避免担心是否包含 WHERE/AND/OR,一个小技巧是包含一个始终通过的子句(或者在 ORing 的情况下永远不会通过)

WHERE 1=1 
    #len(rc.id) ? "AND ID IN ( :id )" : ""#
    AND ...

2) 两次传参,在数据库中进行校验

SELECT *
FROM dbo.pages
WHERE (len(':id') = 0 OR ID IN ( :id ))
...

-- note: this may be problematic if CF is passing null when blank

或者只是长度

    QueryExecute(

    SELECT *
    FROM dbo.pages
    WHERE (:idlen > 0 OR ID IN ( :id ))
    ...
   ,
   {
       id : { value = rc.id, cfsqltype : "cf_sql_integer, list : true },
       idlen : { value = len(rc.id), cfsqltype : "cf_sql_integer" }
   }
于 2019-08-29T20:36:10.363 回答
0

在这里,我给出了关于使查询参数也有条件的示例代码。出于测试目的,我创建了一些默认参数和值

<cfparam name="id" default="1,2,3,4,5,6">

将查询详细信息设置为字符串并将其保存到另一个变量,如上面提到的@danRoberts。

<cfset MyQry = "SELECT * FROM pages ">

检查rc.id值是否为空。如果不是,请附加该IN子句。

<cfif len(rc.id) >
    <cfset MyQry &= " WHERE id IN ( :id ) ">
</cfif>

作为参考,我还添加了一些额外的运算符。

<cfset MyQry &= " limit 10 "> 

接下来,基于new运算符创建一个新查询

<cfset qry = new Query( datasource ='yourDataSource' , sql = MyQry) >

之后,:ID如果rc.id不为空,则为 添加 queryParam

<cfif len(rc.id) >
<cfset qry.addParam( name="id", value="#rc.id#",cfsqltype="cf_sql_varchar",list='true') >
</cfif>

注意:使用IN运算符时,应为 queryParam 设置 list='true'

然后执行查询,如下所示

<cfset Result = qry.execute().getResult() >
<cfdump var="#Result#" />

WHERE只有当 rc.ID 包含一个值时,才会执行带有 queryParam的子句。

于 2019-08-30T08:35:20.530 回答