36

ColdFusion Query オブジェクト内の特定の行をループせずに取得したいと考えています。

私はこのようなことをしたいと思います:

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

<cfset x = QueryName[5]>

しかし、クエリが「5」でインデックス付けできないというエラーが表示されます。このクエリには 5 つ以上のレコードがあることがわかっています。

4

8 に答える 8

66

CF <= 10 では行を取得できません。特定の列を取得する必要があります。

<cfset x = QueryName.columnName[5]>

ただし、この回答を投稿してから8年になります。どうやらCF11はついにその機能を実装しました。この回答を参照してください。

于 2009-07-31T13:51:26.603 に答える
11

もっと簡単な解決策があると思います...列名を知っていて、この列またはその列のみが必要だと思います。次に、行全体を構造体に入れる必要はありません。行番号でクエリを参照できます (0 ではなく 1 ベースであることを思い出してください)。

yourQueryName [" yourColumnName "][ rowNumber ]

<cfoutput>
     #mycontacts["Name"][13]#
     #mycontacts["HomePhone"][13]# 
</cfoutput>
于 2013-05-10T13:56:29.680 に答える
8

最初にクエリを構造体に変換する必要があります。

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

これがあなたを正しい方向に向けることを願っています。

于 2009-07-31T13:52:50.470 に答える
6

「cfquery ブラケット表記」を Google で検索するたびに、このスレッドに戻ってきます。これは、ブラケット表記を使用してこのケースを処理するために作成した関数です。うまくいけば、これは他の誰かにも役立つでしょう:

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

REReplace はオプションです。後で arrayToList 関数を使用しなければならないように、カンマをクレンジングするために入れています。

于 2011-08-03T16:16:09.143 に答える
4

クエリから単一の行を抽出し、列名を保持したかったのです(もちろん)。これが私がそれを解決した方法です:

<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>
于 2012-01-27T14:37:43.130 に答える
1

列名と行番号 (variables.myquery["columnName"][rowNumber]) でクエリ データを取得する前述の方法は正しいですが、クエリ データの完全な行を取得するには便利ではありません。

Railo 4.1 を実行しています。そして、これはクールなソリューションです。残念ながら、完全な行のデータを完全に取得するためにこれを行うことはできませんが、次の方法を使用すると、いくつかのフープを介して必要なものを取得できます。

クエリをserializeJSON(variables.myquery)JSON 形式の cfml 構造体オブジェクトに変更すると、"Columns" と "Data" の 2 つのアイテムが含まれます。これらは両方ともデータの配列です。「データ」配列は、行と列データの 2 次元配列です。

問題は、使用できない文字列があることです。次に、再シリアル化すると、クエリではなく、上記の形式で使用可能な通常の構造体になります。

「variables.myquery」という名前のクエリ変数が既にあるとします。次に、次のコードを見てください。

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

これを取得して、2 次元配列を取得します。

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

そして、これを取得することで、1 つのクエリ行配列を取得します。

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

またはこのように最後の行:

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

また、列の順序番号の反復によって個々の列の値を取得できます。

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

これは低速で、クエリ結果が大きい場合は賢明ではないかもしれませんが、それでもこれは優れたソリューションです。

于 2013-10-08T16:44:24.803 に答える