我可以在ColdFusion中按索引获取查询吗?

时间:2009-07-31 13:31:03

标签: coldfusion cfml cfquery

我希望在ColdFusion Query对象中获取一个特定的行,而不会使其循环。

我想做这样的事情:

<cfquery name="QueryName" datasource="ds">
SELECT *
FROM    tablename
</cfquery>

<cfset x = QueryName[5]>

但它给了我一个错误,说该查询不能被“5”索引。我知道这个查询中有超过5条记录。

8 个答案:

答案 0 :(得分:63)

你不能在CF&lt; = 10中获得一行。你必须得到一个特定的列。

<cfset x = QueryName.columnName[5]>

然而,我发布这个答案已经8年了。显然CF11终于实现了这个功能。见FrankieZ's answer

答案 1 :(得分:11)

现在可以通过QueryGetRow

在coldfusion 11中完成
<cfquery name="myQuery" result="myresult" datasource="artGallery" fetchclientinfo="yes" >
select * from art where ARTID >
<cfqueryparam value="2" cfsqltype="CF_SQL_INTEGER">
</cfquery>

<cfdump var="#myQuery#" >

<cfset data = QueryGetRow(myQuery, 1) >

<cfdump var="#data#" >

答案 2 :(得分:7)

您必须先将查询转换为结构:

<cfscript>
    function GetQueryRow(query, rowNumber) {
        var i = 0;
        var rowData = StructNew();
        var cols = ListToArray(query.columnList);
        for (i = 1; i lte ArrayLen(cols); i = i + 1) {
            rowData[cols[i]] = query[cols[i]][rowNumber];
        }
        return rowData;
    }
</cfscript>

<cfoutput query="yourQuery">
    <cfset theCurrentRow = GetQueryRow(yourQuery, currentRow)>
    <cfdump var="#theCurrentRow#">
</cfoutput>

希望这能指出你正确的方向。

答案 3 :(得分:7)

我认为有一个更简单的解决方案...... 我猜你知道你的列名,只想要这个或那个列。然后,您不需要将整行放在结构中。您可以按行号引用查询(请记住它的1不是0)。

yourQueryName [ “ yourColumnName ”] [ ROWNUMBER ]

<cfoutput>
     #mycontacts["Name"][13]#
     #mycontacts["HomePhone"][13]# 
</cfoutput>

答案 4 :(得分:6)

我知道我在Google“cfquery括号表示法”的任何时候都会回到这个主题。这是我用支架表示法处理这种情况的函数。希望这也可以帮助其他人:

<cffunction name="QueryGetRow" access="public" returntype="array" hint="I return the specified row's data as an array in the correct order">
    <cfargument name="query" required="true" type="query" hint="I am the query whose row data you want">
    <cfargument name="rowNumber" required="true" hint="This is the row number of the row whose data you want">

    <cfset returnArray = []>
    <cfset valueArray = []>

    <cfset cList = ListToArray(query.ColumnList)>
    <cfloop from="1" to="#ArrayLen(cList)#" index="i">
        <cfset row = query["#cList[i]#"][rowNumber]>
        <cfset row = REReplace(row, "(,)", " ")>
        <cfset returnArray[i] = row>
        <cfset i++>
    </cfloop>   
    <cfreturn returnArray>
</cffunction>

REReplace是可选的,我在那里用它来清理逗号,这样如果你不得不使用它就不会搞砸arrayToList函数。

答案 5 :(得分:4)

我想从查询中提取单行,并保留列名(当然)。这就是我解决它的方法:

<cffunction name="getQueryRow" returntype="query" output="no">
    <cfargument name="qry" type="query" required="yes">
    <cfargument name="row" type="numeric" required="yes">
    <cfset arguments.qryRow=QueryNew(arguments.qry.columnlist)>
    <cfset QueryAddRow(arguments.qryRow)>
    <cfloop list="#arguments.qry.columnlist#" index="arguments.column">
        <cfset QuerySetCell(arguments.qryRow,arguments.column,Evaluate("arguments.qry.#arguments.column#[arguments.row]"))>
    </cfloop>
    <cfreturn arguments.qryRow>
</cffunction>

答案 6 :(得分:1)

之前描述的按列名和行号获取查询数据的方法(variables.myquery [“columnName”] [rowNumber])是正确的,但不方便获取整行查询数据。

我正在运行Railo 4.1。这是一个很酷的解决方案。太糟糕了,这不可能按照我们想要的方式完全获得完整的数据行,但是下面的方法可以让我们通过一些箍获得我们想要的东西。

当您serializeJSON(variables.myquery)时,它会将查询更改为带有两个项目的JSON格式的cfml结构对象:“列”和“数据”。这两个都是数据数组。 “data”数组是行的二维数组,然后是列数据。

问题是现在我们有一个无法使用的字符串。然后,如果我们重新序列化它,它不是一个查询,而是可用的上述格式的常规结构。

假设我们已经有一个名为'variables.myquery'的查询变量。然后查看以下代码:

<cfset variables.myqueryobj = deserializeJSON(serializeJSON(variables.myquery)) />

现在你通过这个得到二维数组:

<cfset variables.allrowsarray = variables.myqueryobj.data />

你得到一个查询行数组:

<cfset variables.allrowsarray = variables.myqueryobj.data[1] />

或者这样的最后一行:

<cfset variables.allrowsarray = variables.myqueryobj.data[variables.myquery.recordCount] />

您可以按列顺序号迭代获取单个列值:

<cfset variables.allrowsarray = variables.myqueryobj.data[1][1] />

现在这可能很慢,而且查询结果可能不明智,但这仍是一个很酷的解决方案。

答案 7 :(得分:1)

查看queryGetRow的文档。它接受一个查询对象和一个索引,第一行被引用,索引为1(NOT 0)这样使用的索引必须是一个正整数。

<cfquery name="QueryName" datasource="ds">
  SELECT *
  FROM tablename
</cfquery>

<!---
    This would retrieve the first record of the query
    and store the record in a struct format in the variable 'x'.
--->
<cfset x = queryGetRow(QueryName, 1) />
<!---
    This is an alternative using the member method form of queryGetRow
--->
<cfset x = QueryName.getRow(1) />