質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

2回答

274閲覧

PostgreSQLで複数テーブルからの項目SELECT について

Okamon

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2024/07/22 18:34

実現したいこと

初めてお世話になります。

最近IT技術を学び始めた者で、有識者の方どうかご教示ください。

例えば2つのテーブル(tbl1、tbl2)が存在する時、2つのテーブルから値を取得する方法についてご教示願いたいです。

実現したいこととしては、下記のようなともにid が主キーであるテーブルが2つ存在する時、idをキーとして、下記の条件に則り、SELECTしたいです。
条件①同一カラム名のものはtbl1の値を優先する。
条件②ただし、同一カラム名でもtbl1側の値がnullもしくは空文字の時、tbl2の値を取得する。
条件③片方にしか存在しないカラムはそのまま取得する。

tbl1
id : ID100
subject : math
score : null

tbl2
id : ID100
subject : English
score : 85
date : 20201231

すなわち、上記2テーブルからのSELECT結果の期待値として、下記の通りとなります。
SELECT_OUTPUT

id : ID100
subject : math
score : 85
date : 20201231

発生している問題・分からないこと

上記を実現するにあたり、Postgreではどのようにクエリを書いていくのがよいでしょうか?
外部結合して、何とか取得するのか?と思いましたが、初学者ということもあり、検討が行き詰まっております。

どうかよろしくお願いいたします。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

PostgreSQL での複数テーブルからの情報取得について理解した。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/07/22 23:18

どうしても「SQLとして」片付けなければならない事情があるのでしょうか?
1121

2024/07/23 00:37

chatGPT に丸投げしてみました score が間違ってそうですがどうでしょうか? PostgreSQLで複数テーブルから項目をSELECTするためのクエリを作成する際、指定された条件に基づいてデータを取得するには、COALESCE関数とLEFT JOINを使用すると良いです。以下は、指定された条件に従ってtbl1とtbl2のデータを取得するクエリの例です。 sql SELECT t1.id, COALESCE(t1.subject, t2.subject) AS subject, COALESCE(NULLIF(t1.score, ''), t2.score) AS score, t2.date FROM tbl1 t1 LEFT JOIN tbl2 t2 ON t1.id = t2.id; このクエリの説明は以下の通りです: LEFT JOINを使用して、tbl1とtbl2をid列で結合します。 COALESCE関数を使用して、t1.subjectがNULLまたは空文字の場合はt2.subjectを優先します。 NULLIF関数を使用して、t1.scoreが空文字の場合にNULLとして扱い、COALESCE関数でt2.scoreを優先します。 t2.dateは、tbl1には存在しないカラムなのでそのまま取得します。 これにより、指定された条件に従ってデータを取得することができます。
guest

回答2

0

以下のようなSQLで実現できるかと思います。

SQL

1SELECT 2 T1.id, 3 COALESCE(T1.subject, T2.subject) subject, 4 COALESCE(T1.score, T2.score) score, 5 T2.date 6FROM tbl1 T1 7JOIN tbl2 T2 ON T1.id = T2.id

投稿2024/07/23 00:25

neko_the_shadow

総合スコア2324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

COALESCE または CASE-WHEN を使いましょう。

sql

1SELECT 2 tbl1.id, 3 -- CASE WHEN tbl1.subject IS NOT null THEN tbl1.subject ELSE tbl2.subject END subject, 4 COALESCE(tbl1.subject, tbl2.subject) subject, 5 COALESCE(tbl1.score, tbl2.score) score, 6 tbl2.date 7FROM 8 tbl1, tbl2 9WHERE 10 tbl1.id = tbl2.id;

参考:条件式
https://www.postgresql.jp/docs/16/functions-conditional.html

投稿2024/07/23 00:22

hqf00342

総合スコア351

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問