最近SQLを書くことが多く個人的に困ったことがあったのでそのメモ。

COUNTの引数にDISTINCT文と条件式を同時にとりたいということがありました。

count( DISTINCT "date")

重複した日を省いてカウントしたくて、

count("ID" LIKE '05%' OR NULL)

IDが05始まりのレコードだけカウントしたい。

これを同時こんなふうに書くとエラーが出るわけです。

count(DISTINCT "date" AND "ID" LIKE '05%' OR NULL)

Left side of logical expression must evaluate to a boolean (actual: varchar)

とか、

 mismatched input ‘DISTINCT’.  Expecting: ‘ALTER’, ‘ANALYZE’, ‘CALL’, ‘COMMIT’, ‘CREATE’, ‘DEALLOCATE’, ‘DELETE’, ‘DESC’, ‘DESCRIBE’, ‘DROP’, ‘EXECUTE’, ‘EXPLAIN’, ‘GRANT’, ‘INSERT’, ‘PREPARE’, ‘RESET’, ‘REVOKE’, ‘ROLLBACK’, ‘SET’, ‘SHOW’, ‘START’, ‘UNLOAD’, ‘UPDATE’, ‘USE’, <query>

とか、

 

CASE文を使う

 

IDを絞って、日にちの重複なくカウントするということをどうしても一行で実現したかったので困ってしまいましたが、CASE文を使ったら解決しました。

count( DISTINCT CASE WHEN "ID" LIKE '05%' THEN "date" ELSE NULL END) 

 

こういう書き方をするとSQLもプログラム言語ぽいなと感じました。

 

それでは。