문제

냉담 쿼리 객체에서 특정 행을 반복하지 않고 특정 행을 가져오고 싶습니다.

나는 다음과 같은 일을하고 싶다 :

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

<cfset x = QueryName[5]>

그러나 쿼리가 "5"에 의해 색인이 없다는 오류가 발생합니다. 이 쿼리에 5 개 이상의 레코드가 있다는 사실을 알고 있습니다.

도움이 되었습니까?

해결책

CF <= 10으로 행을 얻을 수 없습니다. 특정 열을 가져와야합니다.

<cfset x = QueryName.columnName[5]>

그러나이 답을 게시 한 지 8 년이 지났습니다. 분명히 CF11은 마침내 그 기능을 구현했습니다. 보다 Frankiez의 대답.

다른 팁

이것은 이제 ColdFusion 11을 통해 달성 될 수 있습니다 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#" >

더 간단한 솔루션이 있다고 생각합니다 ... 당신의 열 이름을 알고이 열을 원한다고 생각합니다. 그런 다음 전체 행을 구조물에 넣을 필요가 없습니다. 쿼리를 행 번호별로 참조 할 수 있습니다 (0이 아닌 1 기반을 기억하십시오).

당신의 queryname["YourColumnName"][Rownumber]

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

먼저 쿼리를 구조물로 변환해야합니다.

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

이것이 당신을 올바른 방향으로 가리키기를 바랍니다.

"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 기능을 망치지 않도록합니다.

쿼리에서 단일 행을 추출하고 열 이름을 (물론) 유지하고 싶었습니다. 이것이 내가 그것을 해결 한 방법입니다.

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

열 이름과 행 번호로 쿼리 데이터를 얻기 위해 이전에 설명 된 메소드 (변수 [ "columnName"] [rownumber])는 정확하지만 전체 쿼리 데이터를 얻는 데 편리하지는 않습니다.

나는 Railo 4.1을 실행하고있다. 그리고 이것은 멋진 솔루션입니다. 너무 나쁘다 이것은 우리가 완전히 데이터를 얻기를 원하는 방식으로 할 수 없지만 다음 방법을 통해 몇 가지 후프를 통해 원하는 것을 얻을 수 있습니다.

때를 serializeJSON(variables.myquery) "열"과 "데이터"라는 두 가지 항목으로 쿼리를 JSON 형식 CFML 구조체 객체로 변경합니다. 이 두 가지 모두 데이터 배열입니다. "데이터"어레이는 행을위한 2 차원 배열과 원주 데이터입니다.

문제는 이제 사용할 수없는 문자열이 있다는 것입니다. 그런 다음 재 시생화하면 쿼리가 아니라 위에서 설명한 형식으로 사용 가능한 일반 구조물입니다.

'변수 .myquery'라는 쿼리 변수가 이미 있다고 가정합니다. 그런 다음 다음 코드를보십시오.

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

이제 이것을 얻음으로써 2 차원 배열을 얻습니다.

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

그리고 당신은 이것을 얻음으로써 하나의 쿼리 행 배열을 얻습니다.

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

또는이 방법으로 마지막 행 :

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

열 순서 번호 반복별로 개별 열 값을 얻을 수 있습니다.

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

이제 이것은 큰 쿼리 결과로 느리고 현명하지 못할 수 있지만 그럼에도 불구하고 멋진 솔루션입니다.

문서를 확인하십시오 querygetrow. 쿼리 객체와 행의 색인을 허용합니다. 1 행이 1 (0이 아님)으로 참조되는 행의 인덱스를 허용합니다.

<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) />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top