Domanda

Voglio ottenere una riga specifica in un oggetto Query ColdFusion senza passarci sopra.

Mi piacerebbe fare qualcosa del genere:

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

<cfset x = QueryName[5]>

Ma mi sta dando un errore dicendo che la query non è indicizzabile per " 5 " ;. So per certo che ci sono più di 5 record in questa query.

È stato utile?

Soluzione

Non puoi ottenere una riga in CF < = 10. Devi ottenere una colonna specifica.

<cfset x = QueryName.columnName[5]>

Sono passati 8 anni da quando ho pubblicato questa risposta. Apparentemente CF11 ha finalmente implementato questa funzione. Vedi la risposta di FrankieZ .

Altri suggerimenti

Ora questo può essere realizzato in coldfusion 11 tramite 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#" >

Penso che ci sia una soluzione più semplice ... Immagino che tu conosca i nomi delle tue colonne e desideri solo questa o quella colonna. Quindi non è necessario inserire l'intera riga in una struttura. Puoi fare riferimento alla query per numero di riga (ricorda che il suo 1 si basa su 0).

yourQueryName [quot &; yourColumnName quot &;] [ RowNumber ]

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

Devi prima convertire la query in una struttura:

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

Spero che questo ti indichi nella giusta direzione.

So di tornare a questa discussione ogni volta che Google " notazione parentesi cfquery " ;. Ecco una funzione che ho scritto per gestire questo caso usando la notazione parentesi. Spero che questo possa aiutare anche qualcun altro:

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

Il REReplace è facoltativo, ce l'ho dentro per pulire le virgole in modo che non rovini la funzione arrayToList in seguito se devi usarlo.

Volevo estrarre una singola riga da una query e mantenere i nomi delle colonne (ovviamente). Ecco come l'ho risolto:

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

I metodi precedentemente descritti per ottenere i dati della query in base al nome della colonna e al numero di riga (variabili.myquery [" columnName "] [rowNumber]) sono corretti, ma non convenienti per ottenere una riga completa di query i dati.

Sto eseguendo Railo 4.1. E questa è una soluzione interessante. Peccato che questo non possa essere fatto nel modo in cui vorremmo ottenere una fila completa di dati, ma il seguente metodo ci consente di ottenere ciò che vogliamo attraverso alcuni cerchi.

Quando serializeJSON(variables.myquery) cambia la query in un oggetto struct cfml formattato JSON con due elementi: " Colonne " e " Dati " ;. Entrambi sono matrici di dati. Il & Quot; dati & Quot; array è un array bidimensionale per righe e quindi dati colonnari.

Il problema è che ora abbiamo una stringa inutilizzabile. Quindi, se ri-serializziamo NON è una query, ma piuttosto una struttura regolare utilizzabile nel formato sopra descritto.

Supponiamo di avere già una variabile di query denominata "variabili.miografia". Quindi guarda il seguente codice:

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

Ora ottieni l'array bidimensionale ottenendo questo:

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

E ottieni un array di righe di query ottenendo questo:

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

O l'ultima riga in questo modo:

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

E puoi ottenere singoli valori di colonna in base all'iterazione del numero di ordine di colonna:

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

Ora questo potrebbe essere lento e forse poco saggio con risultati di query di grandi dimensioni, ma questa è comunque una soluzione interessante.

Consulta la documentazione per queryGetRow . Accetta un oggetto query e un indice della riga con riferimento alla prima riga con l'indice 1 (NON 0) L'indice utilizzato in questo modo deve essere un numero intero positivo.

<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) />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top