• ベストアンサー

NULLを含む文字列の結合で困っています。

いつもお世話になっています。 VB.NET2003+Access2000環境です。 まず前提として、このデータベースにはユニークなフィールドがありません。(残念ながらこちらの都合では変更することはできません) 従って今まではAccessのクエリウイザードを使って文字列を結合(フィールドを結合)して、ユニークなキーを作っていました。 これを今回、VB.NETで動いているアプリの中にボタンを作り、そこからcsvファイルにエクスポートさせるような仕掛けを作ろうとしました。 ところが、あるフィールドがデータが存在したりNULLであったりするため、結合するとNULLになるデータが出現してきます。 (Accessでは結合時、NULLは無視されていたようで影響はありませんでした) これでは検索して絞り込むキーには出来ず、Accessと同じ結果が得られません。 SQL文では(というかデータアダプターに読み込ませるクエリデザイナ作成時に)どういう風に記述すればNULLがあっても区別出来るようになるのでしょうか? 簡単に言えば フィールドA と フィールドB ともにテキストタイプのデータで、BのみNULLもあり得る場合、  select a, b, a+b as tempAB from tableC というSQL文を実行した結果、tempAB が NULL だけにならない方法をご教示ください。 SELECT CASE when~end などをいろいろ試してみましたがダメでした。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

ANo.1です。たびたびすみません。 SQL文、少しですが間違ってました(汗) SELECT a, b, IIF(ISNULL(a),'',a) & IIF(ISNULL(b),'',b) AS tempAB FROM tableC ですね(^^; あと、ついでに、IIF関数については調べてもらえば分かると思いますが、 VBのIIF関数と同じようなものです。この関数はAccess特有のもののようです。 あと、SQL文での文字列連結は、Accessの場合は & らしいです。 SQL Serverだと + で、Oracle等だと || (キーボードの\の部分の縦棒2つ)です。 +しか受け付けないのは、VBで扱うデフォルトのDBがSQL Serverとなっている 感じなので、そのせいでしょうか? これについても、あくまで最終的に処理するのは、使用するDBですので、 DBに合わせた書き方をしておきましょう。

danchor
質問者

お礼

K-Sogacchiさん 再度のご教示有り難うございます。 少し急いでいたので、ダミーの列を設け、そこにNULLデータをダミー文字列に置き換えたものを作り、結合して急場をしのいでおりました。 (この現象の問題については結果は問題なくいけております) ただかなり複雑な操作をやらせておりますので、あちらこちらの修正が必要なことから頭を抱えていたところでした。 ISNULLを使いテストさせていただきましたが、お陰様で目的を達成することが出来ました。 実はさっきテストしたとき、シングルクォーテンションとダブルクォーテーションとを間違える初歩的なミスを犯していたため、SQLに叱られていたことも判明いたしました。 文字列の連結 + は、結果的にSQL Server2005に移行する予定なので問題はないところでした。(他のDBはそちらで動かしています) ありがとうございました。 今後ともよろしくお願いいたします。

その他の回答 (3)

回答No.3

ANo.1です。 申し訳ありません、本を見て回答したのですが、大事な部分を見落としてました(汗)。 Accessの場合、ISNULLでの「変換」は不可能らしいです。NULLかどうか検査出来るだけです。 で、お急ぎのようですので、ヒントだけ出して考えて欲しかったけど、 答えとなる形のSQL文を書いておきます。 後ででも、内容を調査してみてください。 SELECT a, a, IIF(ISNULL(a),'',a) & IIF(ISNULL(b),'',b) AS tempAB FROM tableC …みたいな感じです。 で、確かにデータアダプタ構成ウィザード等で設定しようとすると怒られてしまいますが、 そのまま設定完了してしまいましょう。 結局、最終的にSQL文がOKかどうか判断するのはDBであり、SQL文はあくまで 文字列ですので(パラメータとか使うと一概にタダの文字列とは言えなくなるけど)、 無理やり文字列を設定して、データアクセスしてDBが受け取ってくれれば万事解決です。

回答No.2

SQLは詳しくないのですが、 select a, b, a & iif(b is null,"",b) as tempAB from tableC; とかでできないですかね? あと、気になったんですけど、 SQLとしては一般的なのかもしれないのですが(SQL詳しくないので)、 NULLがあり得るフィールドbを"+"演算子で結合って違和感を感じますね。 私個人の意見なんですけど、"&"演算子てつないだ方が結合って感じがします。あくまで私見ですけど・・・

danchor
質問者

お礼

atomvanishさん こんにちは。 早速有り難うございます。 VB.NET2003 クエリビルダ中にこの記述をすると 「引数リストのエラー ISが認識できません」という内容のエラーが起こります。 また、文字列の結合は一般的には仰るように & でしょうけれど、この例(ドットネットのクエリビルダ)では + にしないとエラーになります。 引き続きよろしくお願いいたします。

回答No.1

Accessであれば、SQL文中にISNULL関数が使えるようです。 ISNULL(NULLになり得るフィールド名, NULLの場合に変換する値) です。

danchor
質問者

お礼

K-Sogacchiさん こんにちは。 早速のご回答有り難うございます。 vb.net2003のクエリビルダ中にこの構文を書くとSQLとしては通るのですが、実行するとエラーになります。 残念ながらそのままではうまくいかないようです。 引き続きよろしくお願いいたします。

関連するQ&A