yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

SQLのカウントで地味にハマったこと

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

(そういえば論理削除はフラグよりもステータスで扱った方がいいみたいな話聞いたけど結局どうなんだろう)

fukabori.fm