1
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:ORで条件を組み合わせる|ANDとの違いと両条件を満たす行

1
Posted at

今回はPostgreSQLのORを使い、少なくとも一方の条件を満たす施設を取得します。取得したデータの意味を整理します。

所要時間は15分ほどです。
それでは、さっそく始めていきましょう!

今日のテーマと到達目標

ORで条件を組み合わせたSQLを自分で書き、ANDとの違いを説明することが目標です。

用語の定義

指定 取得する行
条件1 AND 条件2 両方の条件を満たす行
条件1 OR 条件2 少なくとも一方の条件を満たす行。両方を満たす行も含む

条件式は、各行が指定した条件を満たすかを判定する式です。今回は値が入力済みの都市と開業日を扱います。

取得元はmobility.poisです。1行は1施設を表します。

列名 意味
poi_id 施設を識別するID
poi_name 施設名
city 所在する都市
opened_date 開業日。DATE型

TokyoまたはShinjukuの施設を取得する

SELECT poi_id, poi_name, city
FROM mobility.pois
WHERE city = 'Tokyo'
   OR city = 'Shinjuku'
ORDER BY poi_id;

ORの左右に、都市がTokyoであるという条件式と、都市がShinjukuであるという条件式を書いています。

実行結果は16行でした。施設IDは次のとおりです。

1, 2, 9, 10, 17, 18, 25, 26,
33, 34, 41, 42, 49, 50, 57, 58

「Tokyoの施設はShinjukuではなくても含まれるか」という確認問題には、「含まれる」と回答しました。一方の条件が成り立つので取得対象になります。

都市または開業日で取得する演習

次は、以下の少なくとも一方を満たす施設を取得するSQLを自分で書きました。

  • 都市がTokyoである。
  • 開業日が2024年1月1日以降である。
SELECT poi_id, poi_name, city, opened_date
FROM mobility.pois
WHERE city = 'Tokyo'
   OR opened_date >= DATE '2024-01-01'
ORDER BY poi_id;

実行画面では15行が返りました。施設ID・都市・開業日を抜き出すと次のとおりです。

poi_id city opened_date
1 Tokyo 2021-01-15
8 Kichijoji 2024-01-12
9 Tokyo 2024-08-31
13 Yokohama 2024-04-17
15 Omiya 2024-04-27
17 Tokyo 2021-02-09
23 Omiya 2024-04-13
25 Tokyo 2024-10-15
30 Kawasaki 2024-04-11
33 Tokyo 2021-09-07
41 Tokyo 2019-05-05
42 Shinjuku 2024-02-07
49 Tokyo 2018-01-14
57 Tokyo 2021-07-16
62 Kawasaki 2024-05-18

例えば施設IDが1の行は都市条件だけを、8の行は開業日の条件だけを満たしています。どちらもORの条件を満たすため、結果に含まれています。

両方を満たすと2回表示されるのか

「Tokyoにあり、2024年1月1日以降に開業した施設は、両条件を満たすため2回表示されるか」という質問には、「1回表示されます」と回答しました。

実行結果でも、両条件を満たす施設IDが9と25の行は、それぞれ1回だけ表示されています。

ORは各行を取得するか判定する指定です。満たした条件の数だけ同じ元の行を増やす操作ではありません。また、OR自体が別々の重複行を取り除くわけでもありません。

ANDとの違いを確認する

最後に、都市がTokyoで、開業日が2021年1月15日の施設について考えました。

条件 回答
都市がTokyo OR 開業日が2024年1月1日以降 含まれる
都市がTokyo AND 開業日が2024年1月1日以降 含まれない

どちらも正解です。この施設は都市の条件を満たしますが、開業日の条件は満たしません。ORなら取得対象になり、ANDなら取得対象になりません。

これは条件の意味を答える確認問題です。ANDへ変更したSQLの実行結果を確認したものではありません。

合格条件と学習記録

確認項目 確認できた内容
ORで条件を組み合わせて実行できる TokyoまたはShinjukuの16施設を取得
自分で条件を書ける 都市または開業日の条件で15施設を取得
両方を満たす行の扱いを理解できる 1回表示されると回答
ANDとの違いを説明できる 都市条件だけを満たす施設はORに含まれ、ANDには含まれないと回答

共有されたSQLはエラーなく実行できました。

まとめ

ORでは少なくとも一方の条件を、ANDでは両方の条件を満たす必要があります。ORは両方を満たす行も取得しますが、条件を2つ満たしたことによって同じ元の行が2回返ることはありません。

1
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
1
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?