クエリオブクエリで文字列結合する値がNULLの場合、文字列NULLが挿入される

クエリオブクエリは、文字列連結演算子(|| または +)を使用して文字列を結合することができます。

クエリーオブクエリーのユーザーガイド
https://helpx.adobe.com/jp/coldfusion/developing-applications/accessing-and-using-data/using-query-of-queries/query-of-queries-user-guide.html

(抜粋)

クエリーオブクエリーでは、次の例のように、+ および || の 2 つの文字列連結演算子をサポートしています。

LASTNAME || ', ' || FIRSTNAME

例えば、クエリオブクエリで「SELECT LASTNAME || ',' || FIRSTNAME AS FULLNAME from q」とSQLを記述すると、「苗字,名前」が FULLNAME列に格納されます。

文字列を結合した際に、カラムに入っている値がNULLだった場合、そのカラムの値を結合するとNULLの文字列が挿入されます。

【例】DBから取得した値のレコードセット(qAddress)

ID(Integer) addr1 (Varchar) addr2 (Varchar)
1 東京都〇〇区〇〇 1-2-3 △△△マンション 301号
2 東京都××区×× 4-5-6  

上記の場合、ID 2のaddr2がNULL(ブランク:空文字ではありません)だったとします。取得したレコードセットをそのまま呼び出した場合は、ColdFusionはNULLをempty stringとして内部で処理しますので、ブランクと同じ結果となります。

ところが、クエリオブクエリで、addr1とaddr2を結合したfulladdrを作成すると、以下のようにID 2のaddr2に該当する値にNULLが追加されます。

【例】qAddressのaddr1とaddr2を結合したクエリオブクエリのレコードセット(qoqAddress)
  (select ID, addr1 || addr2 as fulladdr from qAddress)

ID(Integer) fulladdr(Varchar)
1 東京都〇〇区〇〇 1-2-3△△△マンション 301号
2 東京都××区×× 4-5-6NULL

この動作は、クエリオブクエリの制限となります(もし、ID 2のaddr2がNULLではなくブランク(空文字)だった場合はこの問題は発生しません)。

この問題に該当された場合は、クエリオブクエリの実行前に、対象となるカラムの値を文字列処理を行ってください。

上記の例では addr2に対して、下記のように処理します
<cfquery name="qAddress" datasource="DB" >
 select ID, addr1 || addr2 as fulladdr from qAddress
</cfquery>

<cfloop query="qAddress">
  <cfset qAddress["addr2"][qAddress.currentRow] = qAddress.addr2.toString() />
</cfloop>

<cfquery name="qoqAddress" dbtype="query">
 select a,'結合'||a from q
</cfquery>

上記のように文字列処理を行っておくことで、NULLが付加されるのを防ぐことができます。

ID(Integer) fulladdr(Varchar)
1 東京都〇〇区〇〇 1-2-3△△△マンション 301号
2 東京都××区×× 4-5-6

 


記事公開日:2022年05月16日
最終更新日:2022年05月16日

 

 


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.