回答編集履歴

2 誤字の修正

miyahan

miyahan score 2987

2017/07/28 19:48  投稿

SQLではNULLを含んだ計算はNULLになってしまうので、たしかにゴチャゴチャしていますがそんな感じのクエリになってしまうと思います。
今のままでも良いと思いますが、あえていじるとすれば今のクエリは計算方法が若干トリッキーな感じなので、もうちょっと意図がわかりやすいようこんな感じにしてもよいかもしれません。
今のままでも良いと思いますが、あえていじるとすれば今のクエリは計算方法が若干トリッキーな感じなので、もうちょっと意図がわかりやすいようこんな感じにしてもよいかもしれません。
```sql
SELECT COALESCE((col1+col2)/2, col1, col2) AS heikin
FROM table;
```
"col1とcol2の平均か、col1か、col2、 さもなくばnull" という条件がそのまま表れてるのでわかりやすいかも?
[COALESCE関数](https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_coalesce)は最初でNULLではない値を返す関数で、IFNULLが2つの比較なのに対して3つ以上のリストに対応しています。
[COALESCE関数](https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_coalesce)はリストのうち最初に見つかったNULLではない値を返す関数で、IFNULLが2つの比較なのに対して3つ以上のリストに対応しています。
---
そもそもの話をすると、データに null が含まれていることや、カラム同士で計算を行うこと自体、テーブルの設計が適切ではないと考えられます。
col1 および col2 が条件によって必ず null になるような場合は、それぞれのカラムを別テーブルに分ける(正規化)べきですし、複数のデータを入れるために col1, col2, col3, ... と横にいくつもカラムを用意してる場合も別テーブルに1データ1レコードで格納すべきです。
1 参考ページへのリンクを追加

miyahan

miyahan score 2987

2017/07/28 19:35  投稿

```sql
SELECT COALESCE((col1+col2)/2, col1, col2) AS heikin
FROM table;
```
"col1とcol2の平均か、col1か、col2か、null" という条件がそのまま表れてるのでわかりやすいかも?
"col1とcol2の平均か、col1か、col2、 さもなくばnull" という条件がそのまま表れてるのでわかりやすいかも?
[COALESCE関数](https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_coalesce)は最初でNULLではない値を返す関数で、IFNULLが2つの比較なのに対して3つ以上のリストに対応しています。
---
そもそもの話をすると、データに null が含まれていることや、カラム同士で計算を行うこと自体、テーブルの設計が適切ではないと考えられます。
col1 および col2 が条件によって必ず null になるような場合は、それぞれのカラムを別テーブルに分ける(正規化)べきですし、複数のデータを入れるために col1, col2, col3, ... と横にいくつもカラムを用意してる場合も別テーブルに1データ1レコードで格納すべきです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る