アプリ版:「スタンプのみでお礼する」機能のリリースについて

・MySQLのGREATESTで、引数のどれかが NULL である場合、NULLを戻さず、それ以外の残りから ( 最大値の ) 引数を戻すことは可能でしょうか?

・また、GREATEST以外で、同じような処理をするにはどうすれば良いでしょうか?

・後、MAXとは何が違うのでしょうか?


■最終的にやりたいこと
・「aカラム」と「NULLを含むbカラム」の最大値基準で、降順表示したい

A 回答 (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/compariso …
http://dev.mysql.com/doc/refman/5.1/ja/group-by- …
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/30 10:52

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;
でいいのではないかなと思いました。
    • good
    • 1
この回答へのお礼

回答ありがとうございます

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

お礼日時:2013/10/30 10:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A