[リストへもどる]
一括表示

投稿時間:2003/07/18(Fri) 02:02
投稿者名:いわ
URL :
タイトル:
SQLでのソートについて
初めて書き込ませていただきます。
初歩的な質問で失礼致します。

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(Fri) 03:41
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: SQLでのソートについて
質問を見たときには、それぞれ、日付型フィールドかと思ったのですが、
日付部・時刻部が分かれている所を見ると、全てテキスト型なのでしょうか?

> 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", "24:00"), [項目A-2]) ASC

投稿時間:2003/07/18(Fri) 15:31
投稿者名:いわ
Eメール:waburer@yahoo.co.jp
URL :
タイトル:
Re^2: SQLでのソートについて
魔界の仮面弁士さんありがとうございます。

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

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

> 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/18(Fri) 15:44
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: SQLでのソートについて
> A-2の方がNULLにもかかわらず(NULLと認識していないのかもしれないですが)
まずは、それを確認してみて下さい。
「NULL」だと思っていたら、「長さゼロの文字列」だった、なんて事はないですか?

投稿時間:2003/07/18(Fri) 16:37
投稿者名:いわ
URL :
タイトル:
Re^4: SQLでのソートについて
魔界の仮面弁士さん、毎回お世話になります。

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

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/18(Fri) 16:40
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: SQLでのソートについて
DBを扱う時は、NULLが返される事があるので、
$系関数は使わない方が無難かと。

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

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

投稿時間:2003/07/18(Fri) 17:30
投稿者名:いわ
URL :
タイトル:
ありがとうございました
魔界の仮面弁士さんお世話になります。

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

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

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

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

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