mursのColdFusionメモ

頭の中から抜け落ちていく情報をメモがわりに書き溜めていくブログです。

ColdFusionで取得したクエリのカラムリストを取得順で表示したい

これも、何年かに一度使う機会はあるけど、すぐに頭から抜け落ちてしまうのでメモに残しておこう。 取得したクエリオブジェクト(クエリ変数)から取得した列のリストを取得したいと思った時、CFユーザーが真っ先に思い浮かぶのがクエリオブジェクト.columnListだと思う。

例えば、下記のEMPLOYEESテーブルから<cfquery>で取得したクエリオブジェクトがあったとする。

<cfquery datasource="dsn" name="qEmp">
  SELECT * FROM EMPLOYEES
</cfquery>

クエリオブジェクト.columnListで取得した列のリストを取得できるのだが、アルファベット順にソートされてしまう。

<cfoutput>#qEmp.columnList#</cfoutput>
(結果)
COMMISSION_PCT,DEPARTMENT_ID,EMAIL,EMPLOYEE_ID,FIRST_NAME,HIRE_DATE,JOB_ID,LAST_NAME,MANAGER_ID,PHONE_NUMBER,SALARY

カラムリストをソートさせずに取得順に表示したい場合はどうするか? 自分が知っているのは3つの方法がある。

1. (非公式)クエリオブジェクト.getColumnList() を使用する

ColdFusion MX 7の頃から非公式なテクニックとして紹介されていた方法。ColdFusion 2021でも使用できるが、今でも公式なドキュメントには掲載されていないので非公式な方法である。getColumnList()メソッドを使用するとソートされていないカラムリストを配列で取得できるので、その後は希望する形に変換する

<cfdump var="#qEmp.getColumnList()#">

(結果)

<cfoutput>#ArrayToList(qEmp.getColumnList())#</cfoutput>
(結果)
EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

2. (非公式)UDF queryColumns(クエリオブジェクト) を使用する

有志によって公開されているユーザー定義関数(UDF)を使った方法である。対象がMX6以降なので、こちらも古くから紹介されている情報だ。

cflib.org

ColdFusion 2021でも使用できるが、こちらも非公式な方法である。UDFのコードを見ると分かるが、クエリオブジェクトに対して.getMetadata()という内部メソッドを利用している。1.と同様に非公式なメソッドを使用した方法となる。

<cfoutput>#queryColumns(qEmp)#</cfoutput>
(結果)
EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

3. ColdFusion関数のGetMetadata()を使用して作り込む

ColdFusionで用意されているGetMetadata()関数(2.のメソッドと同じ関数名なので混同しないように注意)を使用すると、オブジェクトに関連するメタデータコンポーネントのメソッド、プロパティ、パラメータなど)を取得できる。ColdFusion MX 7からは、クエリオブジェクトにも対応した。

helpx.adobe.com

この関数を使用するとカラムごとに配列で情報が格納されているので、そこからカラムリストを抜き出してリストにする。

<cfdump var="#getMetaData(qEmp)#">

(結果)

<cfset aColumnList=getMetaData(qEmp)>
<cfset queryFields = "">
<cfloop array="#aColumnList#" item="itm">
   <cfset queryFields = listAppend(queryFields,itm["name"])>
</cfloop>
<cfoutput>#queryFields#</cfoutput>
(結果)
EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

参考サイト

burnignorance.com

community.adobe.com