初めて書き込ませていただきます。
初歩的な質問で失礼致します。
VB6からの接続でAccess2000のテーブルに以下のようなデータ
を持っています。
項目A-1 項目A-2 項目B-1 項目B-2
A 2003/1/2 10:00 2003/1/1 AM
B null null 2003/1/1 AM
C 2003/1/4 13:00 2003/1/1 PM
D null null 2003/1/5 PM
E 2003/1/5 10:00 2003/1/2 AM
このデータを以下の条件でソートしたいのです。
KEY1 項目A-1昇順 但し、nullの場合は項目B-1を見る。
KEY2 項目A-2昇順 但し、nullの場合は項目B-2でAMなら12:00
、PMなら24;00と見る。
結果としてBACEDの順になります。
このようなソートを行う場合、一度ダミーテーブルを作成して
行う方法がベストかと思うのですが、
SQLで一発で行う事ってできるのでしょうか?
また、ダミーテーブルを使用する時の手順ってどのようなもの
なのでしょうか?
まだVB初心者でくだらない質問で申し訳ありませんが、よろ
しくお願いいたします。
質問を見たときには、それぞれ、日付型フィールドかと思ったのですが、
日付部・時刻部が分かれている所を見ると、全てテキスト型なのでしょうか?
> SQLで一発で行う事ってできるのでしょうか?
Jet 4.0 なら、こんな感じですかね。
SELECT
*
FROM
テーブル
ORDER BY
IIF( ISNULL([項目A-1]), [項目B-1], [項目A-1]) ASC,
IIF( ISNULL([項目A-2]), SWITCH([項目B-2]="AM", "12:00", [項目B-2]="PM", "12:00"), [項目A-2]) ASC
おっと最後の行が間違っていましたね。PM→24:00なので、こうかな。
IIF( ISNULL([項目A-2]), SWITCH([項目B-2]="AM", "12:00", [項目B-2]="PM", "24:00"), [項目A-2]) ASC
魔界の仮面弁士さんありがとうございます。
> 質問を見たときには、それぞれ、日付型フィールドかと思ったのですが、
> 日付部・時刻部が分かれている所を見ると、全てテキスト型なのでしょうか?
はい、全てテキストです。
> SELECT
> *
> FROM
> [テーブル]
> ORDER BY
> IIF( ISNULL([項目A-1]), [項目B-1], [項目A-1]) ASC,
> IIF( ISNULL([項目A-2]), SWITCH([項目B-2]="AM", "12:00", [項目B-2]="PM", "24:00"), [項目A-2]) ASC
早速やってみたところ、
項目A-1の方はうまくいくのですが、
A-2の方がNULLにもかかわらず(NULLと認識していないのかもしれないですが)
12:00,24:00への変換がうまくいきません(ACCESSで試行)
なぜだかお分かりになりますでしょうか?
よろしくお願い致します。
> A-2の方がNULLにもかかわらず(NULLと認識していないのかもしれないですが)
まずは、それを確認してみて下さい。
「NULL」だと思っていたら、「長さゼロの文字列」だった、なんて事はないですか?
魔界の仮面弁士さん、毎回お世話になります。
かなり苦しいですが以下のようにしたらうまくいきました。
ありがとうございます。
IIF(ISNULL([項目A-1]), [項目B-1], [項目A-1]) ASC,
IIF(ISNULL([項目A-2]) OR MID$([項目A-2],3,1)<>":", SWITCH([項目B-2]="AM", "12:00", [項目B-2]="PM", "24:00"), [項目A-2]) ASC
TRIMを使ったのですが、NULLにはならないんですね。
ブランクエリアを強制NULLにするようなやりかたでもっとスマートに出来ますか?
つまらない質問で申し訳ありませんが、
お分かりになりましたらよろしくお願い致します。
DBを扱う時は、NULLが返される事があるので、
$系関数は使わない方が無難かと。
> ブランクエリアを強制NULLにするようなやりかたでもっとスマートに出来ますか?
「空」を「NULL」のではなく、「NULL」を「空」に揃えるとか。
IIF(Len("" & [項目A-2])=0, SWITCH(〜〜), [項目A-2] ) ASC
魔界の仮面弁士さんお世話になります。
> DBを扱う時は、NULLが返される事があるので、
> $系関数は使わない方が無難かと。
わかりました。ありがとうございます。
> > ブランクエリアを強制NULLにするようなやりかたでもっとスマートに出来ますか?
> 「空」を「NULL」にするのではなく、「NULL」を「空」に揃えるとか。
>
> IIF(Len("" & [項目A-2])=0, SWITCH(〜〜), [項目A-2] ) ASC
確かにこれでうまくいきます。
逆の発想ですね。
今回は何度もご回答を頂き本当に助かりました。
本当に感謝しております。
ありがとうございました。
解決しました。
ツイート | ![]() |