Question

Je souhaite obtenir une ligne spécifique dans un objet ColdFusion Query sans effectuer de boucle.

J'aimerais faire quelque chose comme ça:

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

<cfset x = QueryName[5]>

Mais cela me donne une erreur en disant que la requête n'est pas indexable par " 5 " ;. Je sais pertinemment qu'il y a plus de 5 enregistrements dans cette requête.

Était-ce utile?

La solution

Vous ne pouvez pas obtenir une ligne dans CF < = 10. Vous devez obtenir une colonne spécifique.

<cfset x = QueryName.columnName[5]>

Cela fait 8 ans que j'ai posté cette réponse, cependant. Apparemment, CF11 a finalement implémenté cette fonctionnalité. Voir la réponse de FrankieZ .

Autres conseils

Ceci peut maintenant être accompli dans 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#" >

Je pense qu'il existe une solution plus simple ... Je suppose que vous connaissez vos noms de colonnes et que vous ne voulez que cette colonne ou celle-là. Ensuite, vous n'avez pas besoin de mettre toute la ligne dans une structure. Vous pouvez référencer la requête par numéro de ligne (rappelez-vous que son 1 est basé sur 0).

yourQueryName [& "; yourColumnName &";]] < rowNumber ]

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

Vous devez d'abord convertir la requête en une structure:

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

J'espère que cela vous indique la bonne direction.

Je sais que je reviens sur ce fil de discussion chaque fois que je Google & "; la notation entre crochets cfquery &"; Voici une fonction que j'ai écrite pour gérer ce cas en utilisant la notation entre crochets. J'espère que cela pourra aussi aider quelqu'un d'autre:

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

Le REReplace est facultatif, je l'ai ici pour nettoyer les virgules afin qu'il ne gâche pas la fonction arrayToList ultérieurement si vous devez l'utiliser.

Je voulais extraire une seule ligne d'une requête et conserver les noms de colonne (bien sûr). Voici comment je l'ai résolu:

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

Les méthodes décrites précédemment pour obtenir les données de la requête par nom de colonne et numéro de ligne (variables.myquery ["Name nom_colonne "] [numéro_ligne]) sont correctes, mais peu pratiques pour obtenir une ligne complète de la requête. données.

J'utilise Railo 4.1. Et c'est une solution cool. Dommage que cela ne puisse se faire comme nous le souhaiterions pour obtenir une ligne complète de données, mais la méthode suivante nous permet d'obtenir ce que nous voulons en quelques étapes.

Lorsque vous serializeJSON(variables.myquery), la requête est remplacée par un objet struct cfml au format JSON comportant deux éléments: " Columns " et " Data " ;. Ces deux sont des tableaux de données. Le & Quot; data & Quot; array est un tableau à deux dimensions pour les lignes, puis les données en colonnes.

Le problème est que nous avons maintenant une chaîne inutilisable. Ensuite, si nous le re-sérialisons, il ne s’agit pas d’une requête, mais d’une structure régulière utilisable dans le format décrit ci-dessus.

Supposons que nous ayons déjà une variable de requête nommée 'variables.myquery'. Ensuite, regardez le code suivant:

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

Vous obtenez maintenant le tableau à deux dimensions en obtenant ceci:

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

Et vous obtenez un tableau de lignes de requête en obtenant ceci:

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

OU la dernière ligne de cette façon:

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

Et vous pouvez obtenir des valeurs de colonne individuelles par itération du numéro d'ordre de la colonne:

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

Cela peut être lent et éventuellement imprudent avec des résultats de requête volumineux, mais il s’agit néanmoins d’une solution intéressante.

Consultez la documentation sur queryGetRow . Il accepte un objet de requête et un index de la ligne avec la première ligne référencée avec l'index 1 (NOT 0). L'index utilisé de cette manière doit être un entier positif.

<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) />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top