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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1219閲覧

Orderbyの条件に指定した項目に値が無い場合、別行の値を条件としたい(PostgreSQL)

uraurabow

総合スコア6

PostgreSQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/06/18 14:05

編集2020/06/18 14:18

PostgreSQLについて、履歴データを保存しているテーブルからデータを抽出し、
履歴一覧を表示するシステムのSQL部分の改修を行っております。

履歴テーブル

履歴番号登録日修正元履歴番号
0016/1NULL
0026/2NULL
003NULL001
0046/4NULL

上記のようなデータベース(データの登録は別システムから登録されます)から登録日が新しい順にソートしたデータを抽出したいのですが、現状のSQLでは登録日がNULLの項目の場合最後尾の順番となってしまいます。

抽出結果

履歴番号登録日修正元履歴番号
0046/4NULL
0026/2NULL
0016/1NULL
003NULL001

そこで、修正元履歴番号をキーとして、修正元履歴番号と同じ履歴番号の登録日をソートの条件としたいと考えておりますが、PostgeSQLで実装は可能でしょうか

実現したいソート順イメージ

履歴番号登録日修正元履歴番号
0046/4NULL
0026/2NULL
003NULL001
0016/1NULL

イメージとしては履歴番号003の登録日を履歴番号001の登録日である6月1日であるものとしてソートしたいと考えております

現在のSQLは以下のようになっております

SQL

1select * FROM 履歴 2order by 日付 desc,履歴番号 desc

当方でcase句で別名を付与し、サブクエリで抽出する方法も試行しましたが上手く行きませんでした

SQL

1select 2履歴番号, 3登録日, 4修正元履歴番号, 5 CASE 6 WHEN 登録日 = NULL THEN 登録日 7 WHEN 登録日 = NULL THEN (select 登録日 FROM 履歴 Where 履歴番号 = 修正元履歴番号) 8 END AS ソート日付 9FROM 履歴

当方PostgreSQLについて経験が浅く、皆様の知恵をお貸し頂けますと幸いです
※外部システムとの兼ね合い上テーブルの構造の変更が出来ない為、SQL文で実現できる方法がありましたらご教示頂けますと幸いです。

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

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

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

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

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

uraurabow

2020/06/18 14:19

ご指摘ありがとうございます。、SQLにおいて<コード>を追加させて頂きました
guest

回答2

0

postgres明るくないけど、「登録日 = NULL」は多分無理ゾ。
NULLはイコールで比較すると大概falseになるのでダメです。
あとselectした列はorderbyに指定できるのは覚えておいたほうがいいです。

sql

1select 2履歴番号, 3登録日, 4修正元履歴番号, 5 CASE 6 WHEN 登録日 IS NULL THEN (select 登録日 FROM 履歴 Where 履歴番号 = 修正元履歴番号) 7 /*WHEN 登録日 IS NOT NULL THEN 登録日*/ 8 ELSE 登録日 9 END AS ソート日付 10FROM 履歴 11ORDER BY ソート日付

一番ダメなのは全角スペースがあること…基本全角スペースはプログラムにおいては駆逐するべきものです。
全角スペースを表示するフォントもっと流行って。

投稿2020/06/18 14:59

sousuke

総合スコア3830

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

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

uraurabow

2020/10/02 01:41

お礼が遅くなり申し訳ございません。 回答ありがとうございました。 上記SQLを基に構築する事で事象を改善出来ました
guest

0

ベストアンサー

SQL

1select t1.* 2FROM 履歴 t1 left join 履歴 t2 3 on t1.修正元履歴番号=t2.履歴番号 4order by coalesce(t2.登録日, t1.登録日) desc, 履歴番号

投稿2020/06/18 14:22

編集2020/06/18 14:24
sazi

総合スコア25327

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

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

uraurabow

2020/10/02 01:41

お礼が遅くなり申し訳ございません。 回答ありがとうございました。 上記SQLを基に構築する事で事象を改善出来ました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問