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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

3330閲覧

NULLの場合は別の条件でテーブル結合

xx_6_6_xx

総合スコア42

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2019/05/13 05:14

前提・実現したいこと

select結果がNULLの場合、
別の列をテーブルの結合条件にしたいです。。。

該当のソースコード

postgreSQL

1select 品目 2from tableA as A 3 left join tableB as B 4 on A.管理ID = B.販売ID

↑この結果、品目が「NULL」で出た場合のレコードのみ、、、
| ID |   品目  |
| 01 |  りんご |
| 02 | オレンジ |
| 03 |  NULL  | ←

↓この条件で結合したい

postgreSQL

1select 品目 2from tableA as A 3 left join tableB as B 4 on A.管理ID = B.在庫ID

 | ID |   品目  |
| 01 |  りんご |
| 02 | オレンジ |
| 03 |  レモン  | ← 在庫IDでひっかけてきた!

試したこと

case文で条件分岐…?とも思ったのですが、
そもそも同じSQL文内でselect結果がnulllかどうかなんて
わからないんじゃないかなと思いました。。。

SQLが苦手

いまいち、結果取得のイメージが苦手です。。
どなたか初心者にもわかるように、教えて下さい。。。。。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

販売IDと在庫IDが重ならないなら、from句で結合しても大丈夫でしょうけど、重なる事があるならサブクエリーで取得しないと、取得する状況が変わってきます。

以下の様な状況だとtableAに対して2件取得されてしまいます。
#tableA

管理ID
1

#tableB

販売ID在庫ID品目
12
21

上記の状況で、1件のみ返却されるようにするには

SQL

1select COLAESCE(B.品目, (select 品目 from tableB where 在庫ID=A.管理ID)) As 品目 2from tableA as A 3 left join tableB as B 4 on A.管理ID = B.販売ID

投稿2019/05/13 06:14

編集2019/05/13 06:26
sazi

総合スコア25173

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

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

xx_6_6_xx

2019/05/13 07:08

ご回答ありがとうございます! 今回はID被りはないのですが、あった場合…と考えると完全に盲点でした;; きっと今後も同じようなSQLが必要になるので、 大変参考になります。。!ありがとうございます!
sazi

2019/05/13 07:23

被りが無いなら select 品目 from tableA as A left join tableB as B on A.管理ID in ( B.販売ID, B.在庫ID) でもOKですけどね。
guest

0

ベストアンサー

SQL

1select COALESCE(B1.品目, B2.品目) 2from tableA as A 3left join tableB as B1 on A.管理ID = B1.販売ID 4left join tableB as B2 on A.管理ID = B2.在庫ID

投稿2019/05/13 05:43

kasa0

総合スコア578

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

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

xx_6_6_xx

2019/05/13 07:12

ご回答ありがとうございます! 処理速度も速く、思っていた結果が抽出できました! SQL、参考にさせて頂きます。。! ありがとうございます!
guest

0

SQL

1select * 2from table_A as a 3left join table_B as b 4on a.管理ID = b.販売ID 5or a.管理ID <> b.販売ID 6and a.管理ID = b.在庫ID

投稿2019/05/13 05:27

yambejp

総合スコア114769

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

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

xx_6_6_xx

2019/05/13 07:09

ご回答ありがとうございます! こんな方法があったのですね。。。! そして思っていた結果が抽出できました。 大変参考になります。。!ありがとうございます!
guest

0

null以外とnullで別selectにしてunionすれば良いのではないでしょうか。
最初のselectもinner joinにすればnullを弾けますので、そこから何とかできそうに思います。

イメージ(未検証)

sql

1select 品目 2from tableA as A 3 inner join tableB as B 4 on A.管理ID = B.販売ID 5 6union 7select 品目 from 8( 9select * 10from tableA as A 11 left join tableB as B 12 on A.管理ID = B.販売ID 13where 品目 is null 14) 15 inner join tableB as B 16 on A.管理ID = B.在庫ID 17

※テーブル名の重複解決は適宜調整してください。

投稿2019/05/13 05:25

m.ts10806

総合スコア80850

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

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

xx_6_6_xx

2019/05/13 07:10

いつもご回答ありがとうございます! 検証した結果、pgAdminが悪いのか私が悪いのか、 色々と怒られてしまいました。。 ですが、unionの使いかた、大変参考になりました。。! ありがとうございます!
m.ts10806

2019/05/13 08:25

冒頭にかいた通り未検証なのであくまでイメージです。 実際は調整は必要に思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問