郵便用住所表記の作成で壁にぶつかっています。英語圏向け、中国語圏向け、日本向けの3種類の違った表記法で出力しなければなりません。
前提1
BASEに煩く言われるので、FIREBIRDに移行しても最小限の修正で動かせるように準備しておきたいと思っています。ですがまだFIREBIRDにはできていません。停止する場所を探しながら修正を繰り返しています。私は素人と言っても過言でないビギナーです。
前提2
完全な多言語環境です。使用される場所は日本国内ではなく中国現地法人です。小さな会社ですが4か国の人で構成されています。社内の共通言語は北京語ですが、広東語、日本語、英語が飛びかいます。全ての資料は北京語、日本語、英語の3種類で作成されなければなりません。例えば全ての商品名には、日本語名・中国語名・英語名が並列で存在します。各人はそれぞれ母国語の各種オフィス製品を個人使用していますが、社内資料はリブレで統一されています。
前提3
要するにデータベースを外注できる環境ではありません。小さな会社の複雑で煩雑な多国語データベースを安価に作成してくれる会社は見つかりません。やむなく全てをコツコツと悩みながら自製しています。社内をリブレで統一したのも多言語環境での製品とバージョンの統一を安価に済ませるのが理由です。ひとつのデータベースを各国語バージョンのリブレで皆が使用しています。
前提4
郵便用住所の出力には、日本式住所表記・中国式住所表記・英語式住所表記が必要です。言語によって表記の順番が変わります。また中国式と英語式は日本式とまるで違い、道路名と道路番号で表記されます。この場合、道路名はひとつとは限りません。故に、住所テーブルには実に多くのフィールドがあります。中には日本人の私には想像すらつかなかった表記(ど真ん中とか。。)もあります。これらの個別の住所情報を、ひとつのテーブルから選び、相手国によって組み合わせなければなりません。
前提5
顧客データベースは、ランチェスター型のエリアマーケティング(シェア理論)を実施するために、非常に細かな単位でのエリアに分かれて登録されています。最も小さなエリア単位(小区)が集まって、次の大きさのエリア単位(中区)となり、それらが段階的に大きな集合となっていきます。そのそれぞれの単位で市場分析できるようになっています。道路名は、最も小さなエリア単位と紐づけられています。エリアごと&道路ごとの顧客抽出も可能になっています。ゆえに郵便用住所は、繋がったひとつの列としては登録されていないのです。(最初に同時にやっとけばよかったのですが。。)
●悩んでいる問題
当然ながら、全てのフィールドが埋まっているわけではありません。それらの空白はNULLです。これまではCONCAT関数で綺麗に繋いで出力できていました。NULLのフィールドもそのまま空文字のように無視してくれていました。
ところがFIREBIRDではCONCAT関数が使えません。||
で繋がなければならないようです。さらに、NULLがNULLのままだと、、、繋ぐと全てがNULLになってしまいます。
故に試作中のFIREBIRD版では、COALESCE関数で< '' >
空文字に置き換えてから繋いでいます。
.....|| COALESCE ( "AVE-SML", '' ) || COALESCE ( "AVE-SML-NO", '' ) ||' '||COALESCE ( "AVE-MED", '' ) || COALESCE ( "AVE-MED-NO", '' ) ||....
これで、動くには動いてくれます。上記の真ん中の||' '||
には半角スペースが入っています。道路名と道路名の間などに挿入しています。これを挿入しないと英文字表記は耐えません。
ところが、ここで頭を抱えてしまったのは、あまりにもテーブルの中の空白(NULL)フィールドが多いため、住所表記の途中でやたらと長い「半角スペースの集合」が増えてしまうことです。実は最初は||','||
にしていたのですが、これだと「,」というようになってしまうので半角スペースに変更したのです。
道路名式の住所表記の場合、通常は最初に路地名と道路番地が記載されます。その次に、その路地に繋がる近辺の大通り名と路地への入口に該当する場所の道路番地が記載されます。面倒なのは場所によっては、この道路名が3つになったり1つになったりするのです。まるで規則性がありません。まれに小さな円形道路の真ん中だったりします。「〇〇レストラン斜め向かい」とかも平気であります。
要するにそれらに対応すべく、どうしてもフィールドの数が更に増えてしまいます。でも上記のコードだと、どうしてもNULLの出現ごとに半角スペースが出現します。多少なら気になりませんが、みるからに酷い体裁の住所表記になります。
●失敗している(動いてくれない)解決方法
前の項目がNULLだと「空文字」にして、NULLでない場合だけ半角スペースを挿入したいのです。これができれば半角スペースの連続を回避できます。ですがこれは、ひとつの置き換えしか選択できない<ISNULL>
や<COALESCE>
では解決できません。どうにかこれを解決できないかと、あれこれ悩みにたどり着きました。
.....|| COALESCE ( "AVE-SML", '' ) || COALESCE ( "AVE-SML-NO", '' ) ||IIF( "AVE-SML" IS NULL, '', " " ) ||COALESCE ( "AVE-MED", '' ) || COALESCE ( "AVE-MED-NO", '' ) ||....
ですが、これでは動いてくれません。
Access is denied: IIF in statement .....
と出てきます。
何か良い解決方法はないでしょうか??