Puis-je obtenir une requête ligne par index dans ColdFusion?
Je veux obtenir une ligne spécifique dans un ColdFusion objet de Requête sans boucle sur elle.
J'aimerais faire quelque chose comme ceci:
<cfquery name="QueryName" datasource="ds">
SELECT *
FROM tablename
</cfquery>
<cfset x = QueryName[5]>
Mais il me donne un message d'erreur indiquant que la requête n'est pas indexable par "5". Je sais pour un fait qu'il y a plus de 5 enregistrements dans cette requête.
- CFLib.org à nouveau à la rescousse: cflib.org/udf/queryGetRow . Que vous laisse faire
<cfset x = queryGetRow(QueryName,5)>
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas obtenir une ligne de CF <= 10. Vous devez obtenir une colonne spécifique.
Ça fait 8 ans que j'ai posté cette réponse, cependant. Apparemment CF11 enfin mise en œuvre de la fonctionnalité. Voir FrankieZ réponse.
q=myQuery; r=q.getRow(3); rd=x.getRowData();
ou tout simplementrd=myQuery.getRow(3).getRowData();
Mais cela va retourner un tableau de java-ish valeurs (pour lesquels vous aurez à analyser les valeurs null/vides) et vous perdrez vos en-têtes de colonne. Je peux voir le besoin occasionnel de cela, mais ajoute généralement plus de complexité que vous voulez.Cela peut maintenant être réalisé en coldfusion 11 via QueryGetRow
lazy="true"
à la cfquery balise afin que je puisse tirer des milliers de lignes, sans se soucier de coldfusion essayer de manger toute la mémoire.undefined
pour les valeurs null, où quefor(row in query)
boucle renvoie la chaîne vide. cf11 garde la prestation.Je pense qu'il y a une solution plus simple...
Je suppose que vous connaissez vos noms de colonne et ne veulent cette colonne ou d'une autre. Ensuite, vous n'avez pas besoin de mettre toute la ligne dans une struct. Vous pouvez faire référence à la requête par un numéro de ligne (n'oubliez pas de ses à 1 et non de 0).
yourQueryName["yourColumnName"][rowNumber]
Vous devez convertir la requête struct première:
Espère que cela vous mène dans la bonne direction.
Je sais que je reviens à ce fil, chaque fois que je Google "cfquery support de la notation". Voici une fonction que j'ai écrit pour gérer ce cas à l'aide de support de la notation. J'espère que cela peut aider quelqu'un d'autre aussi:
La REReplace est facultatif, je l'ai dans les là pour nettoyer les virgules, afin de ne pas bousiller la arrayToList fonction plus tard si vous devez l'utiliser.
J'ai voulu extraire une seule ligne à partir d'une requête, et de garder les noms de colonne (bien sûr). C'est comment je l'ai résolu:
Méthodes décrites précédemment pour l'obtention de données de la requête par le nom de la colonne et le numéro de ligne (variables.myquery["nomcolonne"][rowNumber]) sont corrects, mais pas pratique pour l'obtention d'une ligne complète de données de la requête.
Je suis en cours d'exécution Railo 4.1. Et c'est une bonne solution. Dommage que ce ne peut pas être fait de la façon dont nous voulons carrément pour obtenir une ligne de données, mais la méthode suivante nous permet d'obtenir ce que nous voulons, à travers quelques cerceaux.
Lorsque vous
serializeJSON(variables.myquery)
ça change de la requête à un format JSON cfml struct objet de deux éléments: "Colonnes" et "Données". Ces deux sont des tableaux de données. Les "données" de la matrice est un tableau à deux dimensions pour les lignes et puis en colonne des données.Le problème est que maintenant nous avons un inutilisables chaîne. Alors, si nous re-sérialiser ce n'est PAS une question, mais plutôt utilisable régulier de la structure dans le format décrit ci-dessus.
Supposons que nous avons déjà une variable de requête nommée " variables.myquery'. Ensuite, regardez le code suivant:
Maintenant, vous obtenez le tableau à deux dimensions en arriver à ceci:
Et vous obtenez une requête de ligne de tableau en arriver à ceci:
OU la dernière ligne de cette manière:
Et vous pouvez obtenir les valeurs de la colonne par colonne numéro de commande itération:
Maintenant, ce pourrait être lente et éventuellement imprudent avec les grands résultats de la requête, mais c'est une bonne solution quand même.
Consultez la documentation de queryGetRow. Il accepte un objet de requête et d'un indice de la ligne avec la première ligne, référencé par l'indice de 1 (et NON 0) L'indice utilisé de cette façon doit être un entier positif.