複数列の最大値を求める方法

Oracleにはgreatestという関数があって、複数列の最大値を求めることができるらしいのだけど、SQLServerにはそのような関数はない。


SQLServerではcaseを使って書くことになる。たとえば、A,B,Cの3列の最大値を求めたいときは以下のように書く。
select
 case
  when A > B and A > C then A
  when B > C then B
  else C
 end
ただし3列がすべてNULL値でないことが条件。NULL値が含まれているとうまくいかない。

たとえば、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
 when A > (case when B > C then B else C end) then A
 else case when B > C then B else C end
end 
これは、max(A, max(B,C)) をcaseで置き換えたイメージなのだけど、しばらく日をおいてみたら、もう訳が分からない。やめましょう。

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。