Pergunta

Eu quero começar uma linha específica em um objeto ColdFusion consulta sem loop sobre ele.

Eu gostaria de fazer algo parecido com isto:

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

<cfset x = QueryName[5]>

Mas ele está me dando um erro dizendo que a consulta não é indexável por "5". Eu sei para um fato de que há mais de 5 registos nessa consulta.

Foi útil?

Solução

Você não pode obter uma linha na CF <= 10. Você tem que ter uma coluna específica.

<cfset x = QueryName.columnName[5]>

Tem sido 8 anos desde que eu postei esta resposta, no entanto. Aparentemente CF11 finalmente implementado esse recurso. Veja o FrankieZ resposta .

Outras dicas

Isso pode agora ser realizado no ColdFusion 11 via 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#" >

Eu acho que há uma solução mais simples ... Eu estou supondo que você sabe os nomes das colunas e só querem esta coluna ou aquele. Então você não precisa colocar toda a linha em uma struct. Você pode fazer referência a consulta pelo número da linha (lembre-se o seu 1 baseada não 0).

yourQueryName [ " yourColumnName "] [ RowNumber ]

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

Você tem que converter a consulta para um struct em primeiro lugar:

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

Esperamos que este você aponta na direção certa.

Eu sei que eu voltar a esta discussão qualquer momento I Google "notação suporte cfquery". Aqui está uma função que eu escrevi para lidar com este caso usando a notação de suporte. Esperemos que isso pode ajudar alguém demasiado:

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

O REReplace é opcional, eu tê-lo lá para vírgulas purificá para que ele não estragar a função arrayToList mais tarde, se você tem que usá-lo.

Eu queria extrair uma única linha de uma consulta, e mantendo os nomes das colunas (é claro). Isto é como eu resolver isso:

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

Os métodos descritos anteriormente para a obtenção de dados de consulta por nome de coluna eo número da linha (variables.myquery [ "columnName"] [RowNumber]) estão corretas, mas não é conveniente para obter uma linha completa de dados de consulta.

Estou correndo Railo 4.1. E esta é uma solução legal. Pena que isso não pode ser feito da maneira que gostaríamos definitivas para obter uma linha completa de dados, mas o seguinte método nos permite obter o que queremos através de algumas aros.

Quando você serializeJSON(variables.myquery) muda a consulta a um JSON formatado objeto struct CFML com dois itens: "Colunas" e "dados". Ambos são matrizes de dados. A matriz "dados" é uma matriz bidimensional de linhas e, em seguida, os dados colunar.

O problema é que agora temos uma cadeia inutilizável. Então, se nós re-serialize-lo não é uma consulta, mas struct regulares em vez utilizável no formato descrito acima.

Suponha que nós já temos uma variável de consulta chamado 'variables.myquery'. Então olha para o seguinte código:

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

Agora você começa a matriz bidimensional, obtendo com isto:

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

E você começa uma matriz de linha de consulta, obtendo com isto:

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

ou a última linha desta forma:

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

E você pode obter valores de colunas individuais por número de ordem da coluna de iteração:

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

Agora, isso pode ser lento e possivelmente imprudente com grandes resultados da consulta, mas esta é uma solução legal mesmo assim.

Confira a documentação para queryGetRow . Ele aceita um objeto de consulta e um índice da linha com a primeira linha a ser referenciado com o índice de 1 (NÃO 0) O índice usado desta maneira é necessária para ser um número inteiro 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top