プロが教えるわが家の防犯対策術!

質問させて頂きます。

DB:PostgresSQL
言語:PHP

現在仕事情報の入ったテーブルから、金額の高い順にデータを10件取り出したいと考えています。
金額の入ったカラムが1つであれば、order by句で取り出すのですが、今回、時給[hour]、月給[month]、年収[year]と3つのカラムが存在しています。
※下記のid4のように2つ以上の金額情報カラムを持っているデータも存在します。
※データの中にはnullでなく0が入っているデータも存在します。

[id][hour][month][year]
1 ,1000 ,null ,null
2 ,1200 ,0 ,0
3 ,null ,300000 ,null
4 ,1500 ,200000 ,null
5 ,null ,null ,3200000
...
100,null ,250000 ,null


質問の内容なのですが、下記のルールに従いデータを取得する際、どのような方法を行えば一番効率的でしょうか。

「ルール」
1.
金額比較の際、
月給はそのまま、
年収は12で割った金額、
時給に関しては、時給×8(1日の平均的労働時間)×20(1月の平均的な労働日数)の金額とします。

2.
2つ以上のカラムに金額を持っていた際は(id4のようなデータ)、金額の大きさに関わらず、年収>月給>時給の順で取得する。
id4のデータならば、時給の方が月給より高いですが、月給のデータを使用します。年収があれば年収優先。
id2の場合、0はnullと同じ扱いと考え、時給のデータを使用します。


このルールをふまえたうえでデータを取得する際、SQLで全データを取得して、PHPで高い順を判定するべきか、SQLで取得する時点である程度絞って取得した方が良いのか・・・。

SQLに関しての知識が乏しいため、効率的な方法をご存知の方はアドバイス頂けると大変助かります。

よろしくお願いします。

A 回答 (2件)

未テストですが、以下のような感じはどうでしょう?



select case
when year >= month
then year
else
(case
when month >= hour
then month
else hour
end
)
end as money
from
(select COALESCE(year,0) / 12 as year ,
COALESCE(month,0) as month ,
COALESCE(hour,0) * 8 * 20 as hour
from table
)
order by money desc
    • good
    • 0

ムリ。

というか、NULLと0の扱いが一緒なら
NULLがなければいいと思うんですが。

NULLがあるせいで凄いごりごりしないと
いけないですね。


結論的に、どうしてもNULLが必要ならNULLは
見直さなくてもいいけど、DB設計を見直すのが
早いでしょう。
データが登録されるタイミングで、ソート用の
列があれば楽です。
算数、NULLを0に置換済みの列を設けて、それを
インデックスにしてソートすればいいです。


考えるのがめんどいので、今の設計上での
実現方法は他の方におまかせです。
    • good
    • 0

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