Pregunta

Quiero obtener una fila específica en un objeto ColdFusion Query sin hacer un bucle sobre él.

Me gustaría hacer algo como esto:

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

<cfset x = QueryName[5]>

Pero me está dando un error diciendo que la consulta no es indexable por " 5 " ;. Sé a ciencia cierta que hay más de 5 registros en esta consulta.

¿Fue útil?

Solución

No puede obtener una fila en CF < = 10. Debe obtener una columna específica.

<cfset x = QueryName.columnName[5]>

Sin embargo, han pasado 8 años desde que publiqué esta respuesta. Aparentemente, CF11 finalmente implementó esa característica. Consulte la respuesta de FrankieZ .

Otros consejos

Esto ahora se puede lograr en Coldfusion 11 a través de 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#" >

Creo que hay una solución más simple ... Supongo que sabes los nombres de tus columnas y solo quieres esta columna o esa. Entonces no necesitas poner toda la fila en una estructura. Puede hacer referencia a la consulta por número de fila (recuerde que es 1 basado, no 0).

yourQueryName [" yourColumnName "] [ rowNumber ]

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

Primero debe convertir la consulta a una estructura:

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

Espero que esto te indique la dirección correcta.

Sé que vuelvo a este hilo cada vez que busco en Google " cfquery notación de paréntesis " ;. Aquí hay una función que escribí para manejar este caso usando notación de corchetes. Esperemos que esto también pueda ayudar a alguien más:

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

El REReplace es opcional, lo tengo allí para limpiar comas para que no arruine la función arrayToList más adelante si tiene que usarlo.

Quería extraer una sola fila de una consulta y mantener los nombres de columna (por supuesto). Así es como lo resolví:

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

Los métodos descritos anteriormente para obtener datos de consulta por nombre de columna y número de fila (variables.myquery [" columnName "] [rowNumber]) son correctos, pero no convenientes para obtener una fila completa de consultas datos.

Estoy ejecutando Railo 4.1. Y esta es una solución genial. Lástima que esto no se pueda hacer de la manera en que desearíamos obtener una fila completa de datos, pero el siguiente método nos permite obtener lo que queremos a través de unos pocos aros.

Cuando serializeJSON(variables.myquery) cambia la consulta a un objeto de estructura cfml con formato JSON con dos elementos: " Columnas " y " Datos " ;. Ambos son conjuntos de datos. El & Quot; datos & Quot; matriz es una matriz bidimensional para filas y luego datos en columnas.

El problema es que ahora tenemos una cadena inutilizable. Entonces, si volvemos a serializarlo, NO es una consulta, sino una estructura regular utilizable en el formato descrito anteriormente.

Supongamos que ya tenemos una variable de consulta llamada 'variables.myquery'. Luego mira el siguiente código:

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

Ahora obtienes la matriz bidimensional obteniendo esto:

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

Y obtienes una matriz de filas de consultas al obtener esto:

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

O la última fila de esta manera:

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

Y puede obtener valores de columna individuales por iteración de número de orden de columna:

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

Ahora, esto puede ser lento y posiblemente imprudente con grandes resultados de consultas, pero esta es una solución genial, no obstante.

Consulte la documentación de queryGetRow . Acepta un objeto de consulta y un índice de la fila con la primera fila a la que se hace referencia con el índice de 1 (NO 0). El índice utilizado de esta manera debe ser un número entero 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) />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top