- ベストアンサー
GREATESTで NULLをスルーする方法は?
・MySQLのGREATESTで、引数のどれかが NULL である場合、NULLを戻さず、それ以外の残りから ( 最大値の ) 引数を戻すことは可能でしょうか? ・また、GREATEST以外で、同じような処理をするにはどうすれば良いでしょうか? ・後、MAXとは何が違うのでしょうか? ■最終的にやりたいこと ・「aカラム」と「NULLを含むbカラム」の最大値基準で、降順表示したい
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
null を取り得る項目は、 COALESCE を被せて null の場合はその型の最小値を取るようにするとか。 例) ------------------------------------ SELECT * FROM hoge ORDER BY GREATEST(a, COALESCE(b, -2147483648)) DESC; もしくは、CASE式を使ってnull判定をするとか。 例) ------------------------------------ SELECT * FROM hoge ORDER BY CASE WHEN b IS NOT NULL THEN GREATEST(a, b) ELSE a END DESC; SELECT * FROM hoge ORDER BY CASE WHEN b IS NULL THEN a WHEN b > a THEN b ELSE a END DESC; > 後、MAXとは何が違うのでしょうか? MAXは集約関数ですから、複数のレコード(タプル)の指定されたカラム(属性)の最大値を求める関数ですね。一方、GREATEST は与えられた引数の中から最大のものを取り出す関数です。 感覚的には、MAXは縦の中の最大値を求め、GREATESTは横の中の最大値を求めるという感じですね。 http://dev.mysql.com/doc/refman/5.1/ja/comparison-operators.html#function_greatest http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html#function_min
その他の回答 (1)
- Siegrune
- ベストアンサー率35% (316/895)
order by GREATEST(a,IFNULL(b,a)) desc でもできるようです。 ※IFNULL(b,a) bがNullでなければb、Nullならaを返す。 基本的にはANo.1のかたの方法でいいと思いますが、 他の方法も示しておこうかなと思って書いています。 なお以下は蛇足です。 上のIFNULL同様に、 GREATEST(a, COALESCE(b, -2147483648)) DESC; は、 GREATEST(a, COALESCE(b, a)) DESC; でいいのではないかなと思いました。
お礼
回答ありがとうございます >他の方法も示しておこうかなと思って書いています 色々な書き方が出来るんですね 勉強になりましたー
お礼
回答&リンク提示ありがとうございます。 大変参考になりましたー