- PR -

ORDER BY句にはCASEが使えますか?

1
投稿者投稿内容
Bob
会議室デビュー日: 2004/09/27
投稿数: 15
投稿日時: 2004-10-07 11:01
お世話になっております。

指定した条件でSELECTしたレコードを並べ替えたいですが、ORDER BY句にCASEを使う手を考えました。

SELECT
...
FROM
...
WHERE
...
ORDERBY
CASE CONDITION
WHEN 1 THEN TBL1.COL1
WHEN 2 THEN TBL2.COL2
WHEN 3 THEN TBL3.COL3
...
END

ここで、質問ですが、上記の使い方は大丈夫でしょうか?
後、実行してみたのですが、なぜか下記の書き方でないと、エラーが発生します。
CASE CONDITION
WHEN 1 THEN TBL1.COL1
WHEN 2 THEN 'TBL2.COL2'
WHEN 3 THEN 'TBL3.COL3'
...
END
CASE 1の場合「'」付けではしけないようですが。

あと、WHERE句にIF文を使えますか?

以上、ご教授お願いいたします。
Bob
会議室デビュー日: 2004/09/27
投稿数: 15
投稿日時: 2004-10-07 13:29
お世話になっっております。

自己レスです。先ほどのORDER BYではCASEが使えるみたいです。
ただ、「'」をつかるかどうかはColumnの型に関係しています。「DateTime」なら、
「'」が必要です。

以上、よろしくお願いします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-10-07 13:45
引用:

Bobさんの書き込み (2004-10-07 11:01) より:
CASE CONDITION
WHEN 1 THEN TBL1.COL1
WHEN 2 THEN 'TBL2.COL2'
WHEN 3 THEN 'TBL3.COL3'
...
END



って、これだと、TBL2.COL2 っていう文字列をソートに使っていることになりませんか?
当方でも試したところ、データ型の不一致エラーが発生したので、たとえばOracleなら
...
WHEN 2 THEN TO_CHAR(TBL1.COL2, 'YYYYMMDD')
...
とかで型をあわせてやる必要があるのでは。
Bob
会議室デビュー日: 2004/09/27
投稿数: 15
投稿日時: 2004-10-07 15:35
お世話になっております。

こちらの動作環境はMSDE2000です。実現したいのは、StoredProcedureの引数として渡されたCondition値に応じて、適するColの値で並べ替えたい。

実際に動かして見る限り、以下の特例を除き、殆どの場合Column名と'Column'両方が使えます。

1.CASEの一番目は''を付けてはならない
2.Columnの型はDATETIMEの時、Column名そのまま使えない

確かにご指摘を受けたとおり、TBL2.Col2っていう文字列を使った感じですが、結果が正しいですね。

CAST ('TBL2.Col2' AS varchar)でもうまく出来ましたので、これでいかがでしょう?

それとも、StoredProcedureの引数でSQL文を動的に構成する方法はあまり推奨されていませんか?

以上、よろしくお願いいたします。



1

スキルアップ/キャリアアップ(JOB@IT)