複数列の最大値を求める方法
Oracleにはgreatestという関数があって、複数列の最大値を求めることができるらしいのだけど、SQLServerにはそのような関数はない。
SQLServerではcaseを使って書くことになる。たとえば、A,B,Cの3列の最大値を求めたいときは以下のように書く。
たとえば、Aが10、BがNULL、Cが5の場合だと、「10 > NULL」は真ではないので最初のwhenは成立せず、2番目のWhenも成立せずで、「5」が得られてしまう。もちろん、これは正しくない。
NULL値が含まれるときは、ISNULL関数を使って、ISNULL(A, 0)のようにNULLを0に置き換えるのがよさそう。
*
4列以上の最大値を求めたいときは、上のSQLならwhenを増やしていけば簡単に書き換えられる。
以下のようなcaseをネストしたSQLを書いていると訳が分からなくなって拡張不可能です。
SQLServerではcaseを使って書くことになる。たとえば、A,B,Cの3列の最大値を求めたいときは以下のように書く。
selectただし3列がすべてNULL値でないことが条件。NULL値が含まれているとうまくいかない。
case
when A > B and A > C then A
when B > C then B
else C
end
たとえば、Aが10、BがNULL、Cが5の場合だと、「10 > NULL」は真ではないので最初のwhenは成立せず、2番目のWhenも成立せずで、「5」が得られてしまう。もちろん、これは正しくない。
NULL値が含まれるときは、ISNULL関数を使って、ISNULL(A, 0)のようにNULLを0に置き換えるのがよさそう。
*
4列以上の最大値を求めたいときは、上のSQLならwhenを増やしていけば簡単に書き換えられる。
以下のようなcaseをネストしたSQLを書いていると訳が分からなくなって拡張不可能です。
caseこれは、max(A, max(B,C)) をcaseで置き換えたイメージなのだけど、しばらく日をおいてみたら、もう訳が分からない。やめましょう。
when A > (case when B > C then B else C end) then A
else case when B > C then B else C end
end
コメント
コメントを投稿