人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLにおいて

seminar
|seminar_id|seminar_date_1|seminar_date_2|

上記のようなテーブルがあるとして

SELECT seminar_id,
(CASE
WHEN seminar_date_2 = '0000-00-00'
THEN seminar_date_1
ELSE seminar_date_2
END) AS start_date FROM seminar
WHERE start_date > CURDATE()

が通らず、

#1054 - Unknown column 'start_date' in 'where clause'

とエラーを返します。

WHEREをHAVINGに変えると通るのですが、
HAVINGは集合に対して使うものだと思うので腑に落ちません。

私が何か思い違いをしているのでしょうか?

●質問者: FnuLnu
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:00 as CASE MySQL SELECT
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● angemaries
●27ポイント

エイリアスで指定できるのはHAVINGとORDER BYだけです。

WHEREはとおりません。

http://dev.mysql.com/doc/refman/4.1/ja/select.html

HAVINGは構文上はGROUP BYが無くても通りますね。変ですけど。

WHERE

(CASE

WHEN seminar_date_2 = '0000-00-00'

THEN seminar_date_1

ELSE seminar_date_2

END) > CURDATE()

です。

◎質問者からの返答

MySQL限定でalias問題を解決するHAVINGのhackな使い方、

という事で私の中では落ち着きました。


2 ● komamitsu
●27ポイント

WHERE句のほうが先に評価されるのでstart_timeが使えません。

なので泥臭いですが、以下のように書き直せると思います。

SELECT seminar_id,
(CASE
WHEN seminar_date_2 = '0000-00-00'
THEN seminar_date_1
ELSE seminar_date_2
END) AS start_date FROM seminar
WHERE 
(CASE
WHEN seminar_date_2 = '0000-00-00'
THEN seminar_date_1
ELSE seminar_date_2
END) > CURDATE()

HAVING句がこのように使えるのは少し驚きました(PostgreSQL8.3だとHAVING版は通りませんでした)。

◎質問者からの返答

http://dev.mysql.com/doc/refman/4.1/ja/problems-with-alias.html

ああ、なるほど。

単純にエイリアスの評価順の問題なんですね。


3 ● chuken_kenkou
●26ポイント

名前の有効範囲には、RDBMSやそのバージョンにより仕様差があります。

インラインビュー化して内側のクエリで別名を付ければ、外側のクエリでその別名を検索条件で指定できます。


SELECT * FROM(
SELECT
 seminar_id,
 CASE
 WHEN seminar_date_2 = '0000-00-00'
 THEN seminar_date_1
 ELSE seminar_date_2
 END) AS start_date
FROM seminar
) AS x
WHERE start_date > CURDATE()
◎質問者からの返答

SELECTとWHEREで同じCASE式を二重に書くのはさすがに嫌なので、

どのRDBMSでも通りそうなこれが無難そうですかね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ