如何从CFLoop查询结果中删除行

时间:2014-12-29 16:09:03

标签: coldfusion cfquery cfloop

我正在使用循环查询并在存在要加入的记录时加入表。

当没有记录要加入该行时,有没有办法让行完全不返回?

编辑:我在那里错过了一个if语句。我正在循环记录并检查设置选项,如果记录中存在该设置选项,并且查询“someRecord”中没有相应的记录,那么这些是我不想返回的记录。

<cfloop query="myquery">
    <cfif listfindnocase(myquery.setup_option,"required_information")>
        <cfquery name="someRecord" dbtype="query">
            select * from second_table
            where key_id = '#myquery.key_id#'
        </cfquery>
        <cfif someRecord.recordcount eq 0>

        <!--- Need something here to remove this row from returning in the query --->

        </cfif>
    </cfif>
</cfloop>

3 个答案:

答案 0 :(得分:4)

好的,这里的模型答案是:不要在CFML中执行此操作,在DB上执行此操作。 CF用于字符串生成,而不是数据操作。

这个问题有点误导,因为它最初询问如何从查询中删除行,而事实证明 - 这不是要求(请参阅问题的评论)。我已经进一步回答了这个问题。

要简单地退出循环的迭代,请使用<cfcontinue>。这会立即结束循环的当前迭代,并返回到代码块的顶部并开始下一次迭代。使用您自己的代码示例:

<cfloop query="myquery">
    <cfif listfindnocase(myquery.setup_option,"required_information")>
        <cfquery name="someRecord" dbtype="query">
            select * from second_table
            where key_id = '#myquery.key_id#'
        </cfquery>
        <cfif someRecord.recordcount eq 0>
            <cfcontinue>
        </cfif>
        <!--- handle the rows you *do* want to process here --->
    </cfif>
</cfloop>

然而,为了回答如何从查询中删除行的问题,没有优雅的方法。你有两个不优雅的选择:

// pseudocode, for brevity
newQuery = queryNew(oldQuery.columnList)
loop (oldQuery)
    if the row is not wanted
        continue
    /if
    add a row to newQuery
    add the row data to newQuery
/loop

或者:

listOfRowsToExclude = someMechanismToArriveAtSaidList()
<cfquery name="newQuery" type="query">
    SELECT   *
    FROM     oldQuery
    WHERE    id NOT IN (listOfRowsToExclude)
    ORDER BY [same clause as for oldQuery]
</cfquery>

但到目前为止,最好的建议是在数据库中进行数据处理。你不应该把这种逻辑放在你的CFML应用程序中; b)在你的视图代码中,我怀疑这一切都在进行。

将您的逻辑与显示屏分开。并将数据处理逻辑与应用程序逻辑分开。

答案 1 :(得分:1)

不是循环查询以生成多个SELECT(正如其他人提到它使用不必要的资源),也许可以使用IN尝试ValueList子句来提取列表标识:

<cfset myqueryIDs = ValueList(myquery.key_id)>
<cfif listfindnocase(myquery.setup_option,"required_information")>
    <cfquery name="allRecords" dbtype="query">
        select * from second_table
        where key_id IN (#myqueryIDs#) <!--- Assuming numeric IDs --->
    </cfquery>
</cfif>

答案 2 :(得分:0)

我假设在你关闭cfif之后还有其他事情要做,你应该反转你的if语句并执行此操作:

<cfloop query="myquery">
    <cfquery name="someRecord" dbtype="query">
        select * from second_table
        where key_id = '#session.key_id#'
    </cfquery>

    <cfif someRecord.recordcount neq 0>

      <!--- do what you would do when record count NOT equal to zero --->
    </cfif>
</cfloop>