SQLで論理削除されていない件数を一行で出そうとしたら軽くハマったのでメモ。DBはpostgresql。
論理削除フラグはdelfというカラムで0なら削除されていない。1なら削除済みと判別している。
別にgroup byかwhereでカラム指定すればいいんじゃと思うけどgroup byだとレコード分かれちゃうからダメで、3テーブルjoinさせているSQLで対象のテーブルの全レコード論理削除されてる場合も結果に含めたかったのでwhere delf = 0
+LEFT JOINでもうまくいかなかった。
テーブル3のレコードが全て削除されている場合は0で出したかったけどこれだと結果から除外されてしまう↓
SELECT テーブル1のカラム, テーブル2のカラム, COUNT(テーブル3), FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.なんとかid = テーブル2.なんとかid LEFT JOIN テーブル3 ON テーブル2.なんとかID = テーブル3.なんとかid WHERE テーブル3.delf=0
で、調べてこんな感じで書いたらいけた。関数内で条件指定できるらしい。OR NULLは必須。
select COUNT(テーブル3.delf=0 OR NULL) from テーブル名
参考
https://style.potepan.com/articles/20751.html
(そういえば論理削除はフラグよりもステータスで扱った方がいいみたいな話聞いたけど結局どうなんだろう)