我想在 ColdFusion Query 对象中获取特定行而不循环它。
我想做这样的事情:
<cfquery name="QueryName" datasource="ds">
SELECT *
FROM tablename
</cfquery>
<cfset x = QueryName[5]>
但它给了我一个错误,说查询不能被“5”索引。我知道这个查询中有超过 5 条记录。
我想在 ColdFusion Query 对象中获取特定行而不循环它。
我想做这样的事情:
<cfquery name="QueryName" datasource="ds">
SELECT *
FROM tablename
</cfquery>
<cfset x = QueryName[5]>
但它给了我一个错误,说查询不能被“5”索引。我知道这个查询中有超过 5 条记录。
你不能在 CF <= 10 中得到一行。你必须得到一个特定的列。
<cfset x = QueryName.columnName[5]>
然而,自从我发布这个答案已经 8 年了。显然 CF11 终于实现了这个功能。看到这个答案。
这现在可以通过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#" >
我认为有一个更简单的解决方案......我猜你知道你的列名并且只想要这个或那个。然后你不需要把整行放在一个结构中。您可以按行号引用查询(记住它是基于 1 而不是 0)。
<cfoutput>
#mycontacts["Name"][13]#
#mycontacts["HomePhone"][13]#
</cfoutput>
您必须先将查询转换为结构:
<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>
希望这能为您指明正确的方向。
我知道每当我谷歌“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 函数。
我想从查询中提取一行,并保留列名(当然)。这就是我解决它的方法:
<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>
前面介绍的通过列名和行号(variables.myquery["columnName"][rowNumber])获取查询数据的方法是正确的,但是不方便获取整行的查询数据。
我正在运行 Railo 4.1。这是一个很酷的解决方案。太糟糕了,这不能像我们想要的那样直接获得一整行数据,但是下面的方法允许我们通过几个圈来获得我们想要的东西。
当您serializeJSON(variables.myquery)
将查询更改为带有两项的 JSON 格式的 cfml 结构对象时:“列”和“数据”。这两个都是数据数组。“数据”数组是一个二维数组,用于行和列数据。
问题是现在我们有一个不可用的字符串。然后,如果我们重新序列化它,它就不是查询,而是上述格式的可用常规结构。
假设我们已经有一个名为“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] />
现在,对于大型查询结果,这可能会很慢并且可能不明智,但这仍然是一个很酷的解决方案。
查看queryGetRow的文档。它接受一个查询对象和一个行的索引,第一行被引用的索引为 1(非 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) />