見出し画像

【SQL】COALESCE関数でNULLを別の値に置き換える

¡Hola! マイコです。

先日作成したIF関数を使ったこちらのSQL。
詳細な分析をしている中で改良の必要性が生じたのですが、COALESCE関数を使って無事解決することができました。今回はCOALESCE関数を紹介します。

やりたいこと

先日作ったクエリは、2つのカラムで日時情報(回答日時(answered_at)と辞退日時(declined_at))を比較して大きい方を取得するのですが、一方がNULLだと比較ができずうまく処理ができません。

どちらか一方がNULLの場合は値があるもののみを表示させたいです。

解決策

COALESCE関数を使ってNULLを別の値に置き換えます。今回のクエリでは、思いっきり過去の日付(0001-01-01)にします。

COALESCE関数の使い方

COALESCE(対象カラム名, '置換したい値'

COALESCEを使って書き換える

IF文で書くとこうなります。

SELECT
user_id,
IF(
COALESCE(max(declined_at), '0001-01-01') > COALESCE(max(answered_at), '0001-01-01'),
max(declined_at),
IF(
COALESCE(max(declined_at), '0001-01-01') < COALESCE(max(answered_at), '0001-01-01'),
max(answered_at),
NULL
)
) as last_replied_time
FROM users
GROUP BY user_id;

CASE文で書くこともできます。
ネストしていないのでこちらの方が美しい気もします。

SELECT
user_id,
CASE
WHEN COALESCE(max(declined_at), '0001-01-01') > COALESCE(max(answered_at), '0001-01-01') THEN max(declined_at)
WHEN COALESCE(max(declined_at), '0001-01-01') < COALESCE(max(answered_at), '0001-01-01') THEN max(answered_at)
ELSE NULL
END as last_replied_time
FROM users
GROUP BY user_id;

どちらもちゃんと動きました。

以上。

この記事が気に入ったらサポートをしてみませんか?