Frage

Ich möchte eine bestimmte Zeile in einem Coldfusion-Abfrage-Objekt erhalten, ohne über sie Looping.

Ich möchte etwas tun:

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

<cfset x = QueryName[5]>

Aber es gibt mir eine Fehlermeldung, dass die Abfrage von „5“ nicht Wende ist. Ich weiß für eine Tatsache, dass es mehr als 5 Einträge in dieser Abfrage.

War es hilfreich?

Lösung

Sie können nicht eine Zeile in CF bekommen <= 10. Sie haben eine bestimmte Spalte zu erhalten.

<cfset x = QueryName.columnName[5]>

Es ist 8 Jahre her, dass ich diese Antwort geschrieben, aber. Offenbar implementiert CF11 schließlich diese Funktion. Siehe FrankieZ Antwort .

Andere Tipps

Dies kann nun in Coldfusion 11 über QueryGetRow

<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#" >

Ich denke, es ist eine einfachere Lösung ... Ich vermute, Sie Ihre Spaltennamen kennen und wollen nur diese Spalte oder dass man. Dann brauchen Sie nicht die ganze Zeile in einer Struktur zu setzen. Sie können die Abfrage von Zeilennummer Referenz (nicht vergessen seine 1 basierend nicht 0).

yourQueryName [ " yourColumnName "] [ rowNumber ]

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

Sie haben die Abfrage auf eine Struktur konvertieren zuerst:

<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>

Hope diese Punkte, die Sie in der richtigen Richtung.

Ich weiß, ich komme jederzeit wieder auf diesen Thread ich Google „cfquery Dirac-Notation“. Hier ist eine Funktion, die ich schrieb, diesen Fall zu behandeln Klammer-Notation. Hoffentlich kann dies jemand helfen sonst auch:

<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>

Die REReplace optional ist, ich habe es dort in Kommata zu reinigen, so dass es nicht die ArrayToList Funktion nicht vermasselt später, wenn Sie es verwenden.

Ich wollte eine einzelne Zeile aus einer Abfrage extrahieren, und halten Sie die Spaltennamen (natürlich). Dies ist, wie ich es gelöst:

<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>

Methoden zuvor für den Erhalt Abfragedaten von Spaltennamen und Zeilennummer (variables.myquery [ „column“] [rowNumber]) beschrieben sind korrekt, aber nicht praktisch für eine vollständige Reihe von Abfragedaten zu bekommen.

Ich bin mit Railo 4.1. Und das ist eine coole Lösung. Schade, kann dies nicht die Art und Weise getan werden, wir wollen geradezu eine vollständige Reihe von Daten zu erhalten, aber die folgende Methode ermöglicht es uns, zu bekommen, was wir durch ein paar Reifen wollen.

Wenn Sie serializeJSON(variables.myquery) es ändert sich die Abfrage auf eine JSON formatiert cfml struct-Objekt mit zwei Elemente: „Spalten“ und „Data“. Beide sind Arrays von Daten. Der „Daten“ Array ein zweidimensionales Feld für die Zeilen und Spaltendaten.

Das Problem ist, dass wir jetzt eine unbrauchbare Zeichenfolge haben. Dann, wenn wir es wieder serialisiert es ist nicht eine Abfrage, sondern nutzbare regelmäßige Struktur im oben beschriebenen Format.

Angenommen wir bereits eine Abfragevariable mit dem Namen ‚variables.myquery‘. Schauen Sie sich den folgenden Code:

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

Sie nun die zweidimensionale Matrix erhalten, indem diese bekommen:

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

Und Sie erhalten eine Abfrage Reihe Array durch diese bekommen:

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

oder die letzte Zeile auf diese Weise:

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

Und Sie können einzelne Spaltenwerte durch Spalte Bestellnummer Iteration erhalten:

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

Nun könnte dies sein langsam und möglicherweise unklug mit großen Abfrageergebnissen, aber das ist eine coole Lösung dennoch.

Überprüfen Sie die Dokumentation aus für queryGetRow . Er nimmt ein Abfrage-Objekt und einen Index der Reihe mit der ersten Reihe mit dem Index 1 (NOT 0) wird der Index auf diese Weise eine positive ganze Zahl, die erforderlich ist, verwendete das verwiesen wird.

<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) />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top