mursのColdFusionメモ

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

ColdFusionで取得したクエリオブジェクトのデータ型を変える

ColdFusionのクエリオブジェクトは、データベースからデータを取得した際に作成されるオブジェクト(クエリ変数と言ったりすることが多い)である。 中身はもちろん抽出したレコードセットが入っていて、それをループして画面に表示したり<cfoutput query="クエリオブジェクト名">...</cfoutput> 処理を行ったり<cfloop query="クエリオブジェクト名">...</cfloop>でき、配列ライクな操作で特定のレコードのデータを取得することもできる。

さらに、クエリオブクエリを使用すれば、レコードセットに対して、さらに条件を絞ったデータを抽出したり、2つのレコードセット(クエリオブジェクト)をwhere結合することもできる。 DBへの処理回数を減らすことができ(今となっては処理回数を減らすことのリソースの向上は限定的だろうが)、自分も事あることに利用している。

クエリオブクエリで使用できる機能や記述方法についてはオンラインマニュアルに詳しく紹介されている helpx.adobe.com

クエリオブクエリの機能の一つに文字列の結合があるが、下記のFAQで値がNULLの場合に発生する問題についての対処方法を紹介している。

cfassociates.samuraiz.co.jp

このブログではもう一つ困ったことがある点をメモしておく。それは、クエリオブクエリで文字列結合をする際に、対象のカラムのデータ型が文字型じゃないと結合時にエラーや問題が発生することである。

例えば、SELECT P1 || P2 as P from *query_object*のクエリオブクエリで、P1列がNumberやInteger型・P2列がVarchar型だった場合に、下記のようなエラーが発生する

データベースクエリーを実行する際のエラーです。
Query Of Queries runtime error.
バイナリ オペレーションで、INTEGER タイプと VARCHAR タイプを組み合わせることはできません

他にも、数字型カラム同士を結合すると、エラーは発生しないが値が足し算されてしまう(カラムA:1、カラムB:2だった場合、12としたいのに 3になってしまう)こと。 画面に表示するだけだったら表示の際に見た目で上手くやりくりすればよいけれども、他の処理にも使ったりしたいときは何かと便利なクエリオブジェクトの中で解決したい。

なんか良い方法はないかなと思って探していたら、有志が公開しているUDF(User Defined Functions:ユーザー定義関数)でぴったりなのを見つけた。

cflib.org

このUDFを使用したら変換したいクエリオブジェクトの列とデータ型を指定するだけでUDFがデータ型を変換してくれる。 なので、クエリオブクエリの文字列結合をしたい際も、このUDFを使って数字型や日付型のデータを文字型に変更しておけば簡単にできる。 UDFなのでベタにそのページ貼っておいても良いし、テンプレ化してApplictaion.cfc|.cfmとかでインクルードしても良いし。

他にもcflib.orgで紹介されているUDFをいくつか使っているハズだけど、わ、忘れている。思い出し次第ここに追加していこう。