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

Bri*_*ton 35 coldfusion cfquery cfml

我想在ColdFusion Query对象中获取特定行而不循环它.

我想做这样的事情:

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

<cfset x = QueryName[5]>
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ney 65

你不能在CF <= 10中获得一行.你必须获得一个特定的列.

<cfset x = QueryName.columnName[5]>
Run Code Online (Sandbox Code Playgroud)

然而,我发布这个答案已经8年了.显然CF11终于实现了这个功能.见FrankieZ的回答.

  • 我更喜欢行和列的括号表示法,但无论哪种方式都有效.QueryName [ "COLUMNNAME"] [5].例如,如果要将变量用于列名,则需要括号表示法. (8认同)
  • 不对.您可以获得一行,只是不使用标准的CF API.并且您将无法通过变量名直接访问列 - 您必须知道索引.您可以执行myquery.getRow(0)以获取第一个"coldfusion.sql.imq.Row",并使用myrow.getColumn(0)获取第一列.Row还有一个方法来获取表示整行的Object []. (2认同)
  • @Mark:是的,我认为这对大多数人来说大多数时间都不会有用.这些是java对象/方法,并不像日常使用那样方便:`q = myQuery; R = q.getRow(3); rd = x.getRowData();`或者只是`rd = myQuery.getRow(3).getRowData();`但是这将返回一个java-ish值数组(你必须解析nulls/empties)你会丢失列标题.我偶尔会看到这种需求,但通常会增加你想要的复杂性. (2认同)

Fra*_*erZ 12

现在可以通过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#" >
Run Code Online (Sandbox Code Playgroud)

  • 杀手回答.我很惭愧地说我不知道​​这个功能.cf11一直在交付! (3认同)

and*_*inn 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>
Run Code Online (Sandbox Code Playgroud)

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


Mr.*_*ack 7

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

yourQueryName [" yourColumnName "] [ rowNumber ]

<cfoutput>
     #mycontacts["Name"][13]#
     #mycontacts["HomePhone"][13]# 
</cfoutput>
Run Code Online (Sandbox Code Playgroud)


mar*_*oed 6

我知道每当我谷歌"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>
Run Code Online (Sandbox Code Playgroud)

REReplace是可选的,我在那里清理逗号,以便以后如果必须使用它就不会搞砸arrayToList函数.