2013-05-08 2 views
3

다음과 같은 쿼리가 있습니다. 얼마나 많은 결과가 있을지 모르는 경우 각 값을 배열에 넣는 가장 좋은 방법은 무엇입니까? 일반적으로 루프를 사용하여이 작업을 수행하지만 결과가 얼마나 많은지 전혀 알 수 없습니다. 결과를 세는 다른 쿼리를 먼저 실행해야합니까?데이터베이스에서 각 행의 값을 배열로 가져 오는 방법이 있습니까?

<CFQUERY name="alllocations" DATASOURCE="#DS#"> 
    SELECT locationID 
    FROM tblProjectLocations 
    WHERE projectID = '#ProjectName#' 
</CFQUERY> 

답변

7

어레이에 대해 수행 할 작업에 따라, 당신은 예를 들어, 대부분의 배열 작업에 직접 열을 참조 할 수 있습니다

i = arrayLen(alllocations["locationID"]); 

대부분의 배열 작업을 위해 작동 할 수 표기법을 사용.

이것은 "배열을 만듭니다"는 것입니다. 질문 열 - coldfusion.sql.QueryColumn 개체가 배열이 일 때 CF로 변환 할 수 있도록 CFML 배열에 충분히 가깝습니다. 필요한. 따라서 열은 배열 함수로 전달 될 수 있습니다. 하나 이 할 수있는 일

은 이것이다 :

myArray = q["locationID"]; 

기본적으로 CF 문자열이 할 수있는 것처럼 q["locationID"]을 취급하기 때문이고, 문자열 값의 첫 번째 행에 무엇이있다 q 쿼리의 locationID 열 배열이 실제로 일 때만입니다.은 배열로 CF를 대신 변환합니다. 이것은 기본적으로 느슨한 타이핑이 작동하는 방식입니다.

배열을 필요로하는 일부 함수에 쿼리 열을 전달하면 위 구문을 사용할 수 있습니다. 실제로 변수에 열을 넣어하려는 경우, 당신은 같은 것을 할 필요가있을 것이다 :

myArray = listToArray(valueList(q.localtionID)); 

NB를 : 당신이 대신 필터 값에 <cfqueryparam>을 사용해야합니다 SQL 문에 그들을 하드 코딩 할 .

+0

그래서 루프를 올바르게 사용해야합니까? 내가 얼마나 길게 될지 모른다면 루프에 대해 To = ""에 무엇을 넣을 것인가? 루프 외부에서이 코드에 액세스 할 수 있는지 궁금합니다. – Guyver

+0

그래서 alllocations라는 배열을 만들겠습니까? 배열의 단일 행 또는 모든 행 값일까요? – Guyver

+1

아니요, CFML이 자동 유형 캐스팅으로 매우 진보적 인 것입니다. alllocations [ "locationID"]는 전체 질의 열에 대한 참조이며,'coldfusion.sql.QueryColumn' 타입의 객체입니다. 그러나'class coldfusion.sql.QueryColumn' 배열을 기대하는 뭔가, CF 배열로 변환합니다. 나는 내 대답을 약간 업데이트 할 것이다. –

0

만 쿼리에서 한 필드 값을 검색하고 있기 때문에, 당신은 배열로 목록을 변경하려면 listToArray()를 사용 후, locationIds의 쉼표로 구분 된 목록에 쿼리 결과를 변환 ValueList()를 사용할 수 있습니다.

쿼리에서 여러 필드 값을 검색하는 경우 쿼리를 반복하고 주어진 행의 모든 ​​필드 값을 구조체에 복사 한 다음 arrayAppend()을 사용하여 해당 구조체를 배열에 추가 할 수 있습니다.

(이 기능에 익숙하지 않은 경우 Adobe 문서 또는 cfquickdocs.com에서 찾아 볼 수 있습니다.)

1

myquery.column.toArray() 또한 문서화되지 않은 좋은 선택입니다.

+0

그 방법으로 반환 된 배열은 CF 배열과 조금 다릅니다. 그들은'arrayAppend','arrayDelete' 등 수정할 수 없습니다. – Leigh