ColdFusion에서 색인별로 쿼리 행을 얻을 수 있습니까?
-
06-07-2019 - |
문제
냉담 쿼리 객체에서 특정 행을 반복하지 않고 특정 행을 가져오고 싶습니다.
나는 다음과 같은 일을하고 싶다 :
<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) />