0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQL における EXISTS とスカラーサブクエリの違いまとめ

Posted at

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列である必要あり、可読性が低い、複数行返すとエラー
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?