• ベストアンサー

GREATESTで NULLをスルーする方法は?

・MySQLのGREATESTで、引数のどれかが NULL である場合、NULLを戻さず、それ以外の残りから ( 最大値の ) 引数を戻すことは可能でしょうか? ・また、GREATEST以外で、同じような処理をするにはどうすれば良いでしょうか? ・後、MAXとは何が違うのでしょうか? ■最終的にやりたいこと ・「aカラム」と「NULLを含むbカラム」の最大値基準で、降順表示したい

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

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

re97
質問者

お礼

回答&リンク提示ありがとうございます。 大変参考になりましたー

その他の回答 (1)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

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; でいいのではないかなと思いました。

re97
質問者

お礼

回答ありがとうございます >他の方法も示しておこうかなと思って書いています 色々な書き方が出来るんですね 勉強になりましたー

関連するQ&A