PostgreSQL で特定条件の行が存在するかどうか確認する場合、よく使われる書き方に次の 2 つがあります。
SELECT EXISTS
SELECT EXISTS (
SELECT 1
FROM users
WHERE user_id = 123
);
特徴
返り値:1行1列の真偽値 (true / false)
動作:
内部の SELECT が 1件でも行を返せば true
行がなければ false
メリット:
存在確認だけでよい場合は最適化されており高速
結果が常に 1 行で固定されるためアプリ側での処理が簡単
可読性が高く、実務では一般的
外側で SELECT 1 + スカラーサブクエリ
SELECT 1
FROM users
WHERE (SELECT 1 FROM users WHERE user_id = 123);
特徴
返り値:条件を満たす場合は 1 行、満たさなければ 0 行
注意点:
サブクエリは 1 行 1 列のスカラー値 を返す必要がある
複数行を返すとエラーになる
外側で 1 を返すだけだと、どの行を返しているのか分かりにくく可読性が低い
改善例
「存在確認だけ」が目的なら EXISTS を使うのが一般的・安全・高速
外側で SELECT 1 する場合は、カラム名を付けたり、返す値を明確にする方が可読性が上がる
まとめ
| 書き方 | 返り値 | 特徴 |
|---|---|---|
SELECT EXISTS(...) |
1行1列 (true / false) |
存在チェック用、常に1行、可読性高、パフォーマンス良好 |
SELECT 1 FROM ... WHERE (SELECT 1 ...) |
条件に合えば1行、合わなければ0行 | スカラーサブクエリが1行1列である必要あり、可読性が低い、複数行返すとエラー |