SQLで条件付ソートを行うには?

解決


いわ  2003-07-18 11:12:55  No: 78690

初めて書き込ませていただきます。
初歩的な質問で失礼致します。

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初心者でくだらない質問で申し訳ありませんが、よろ
しくお願いいたします。


魔界の仮面弁士  2003-07-18 12:36:50  No: 78691

質問を見たときには、それぞれ、日付型フィールドかと思ったのですが、
日付部・時刻部が分かれている所を見ると、全てテキスト型なのでしょうか?

> 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


魔界の仮面弁士  2003-07-18 12:39:33  No: 78692

おっと最後の行が間違っていましたね。PM→24:00なので、こうかな。

 IIF( ISNULL([項目A-2]), SWITCH([項目B-2]="AM", "12:00", [項目B-2]="PM", "24:00"), [項目A-2]) ASC


いわ  2003-07-19 00:30:23  No: 78693

魔界の仮面弁士さんありがとうございます。

> 質問を見たときには、それぞれ、日付型フィールドかと思ったのですが、
> 日付部・時刻部が分かれている所を見ると、全てテキスト型なのでしょうか?

はい、全てテキストです。

> 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で試行)

なぜだかお分かりになりますでしょうか?

よろしくお願い致します。


魔界の仮面弁士  2003-07-19 00:46:09  No: 78694

> A-2の方がNULLにもかかわらず(NULLと認識していないのかもしれないですが)

まずは、それを確認してみて下さい。
「NULL」だと思っていたら、「長さゼロの文字列」だった、なんて事はないですか?


いわ  2003-07-19 01:35:32  No: 78695

魔界の仮面弁士さん、毎回お世話になります。

かなり苦しいですが以下のようにしたらうまくいきました。
ありがとうございます。

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にするようなやりかたでもっとスマートに出来ますか?

つまらない質問で申し訳ありませんが、
お分かりになりましたらよろしくお願い致します。


魔界の仮面弁士  2003-07-19 01:38:51  No: 78696

DBを扱う時は、NULLが返される事があるので、
$系関数は使わない方が無難かと。

> ブランクエリアを強制NULLにするようなやりかたでもっとスマートに出来ますか?
「空」を「NULL」のではなく、「NULL」を「空」に揃えるとか。
  IIF(Len("" & [項目A-2])=0, SWITCH(〜〜), [項目A-2] ) ASC


いわ  2003-07-19 02:30:48  No: 78697

魔界の仮面弁士さんお世話になります。

> DBを扱う時は、NULLが返される事があるので、
> $系関数は使わない方が無難かと。

わかりました。ありがとうございます。

> > ブランクエリアを強制NULLにするようなやりかたでもっとスマートに出来ますか?
> 「空」を「NULL」にするのではなく、「NULL」を「空」に揃えるとか。

>   IIF(Len("" & [項目A-2])=0, SWITCH(〜〜), [項目A-2] ) ASC

確かにこれでうまくいきます。
逆の発想ですね。

今回は何度もご回答を頂き本当に助かりました。
本当に感謝しております。
ありがとうございました。


いわ  2003-07-19 03:02:03  No: 78698

解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加