PostgreSQLについて、履歴データを保存しているテーブルからデータを抽出し、
履歴一覧を表示するシステムのSQL部分の改修を行っております。
履歴テーブル
履歴番号 | 登録日 | 修正元履歴番号 |
---|---|---|
001 | 6/1 | NULL |
002 | 6/2 | NULL |
003 | NULL | 001 |
004 | 6/4 | NULL |
上記のようなデータベース(データの登録は別システムから登録されます)から登録日が新しい順にソートしたデータを抽出したいのですが、現状のSQLでは登録日がNULLの項目の場合最後尾の順番となってしまいます。
抽出結果
履歴番号 | 登録日 | 修正元履歴番号 |
---|---|---|
004 | 6/4 | NULL |
002 | 6/2 | NULL |
001 | 6/1 | NULL |
003 | NULL | 001 |
そこで、修正元履歴番号をキーとして、修正元履歴番号と同じ履歴番号の登録日をソートの条件としたいと考えておりますが、PostgeSQLで実装は可能でしょうか
実現したいソート順イメージ
履歴番号 | 登録日 | 修正元履歴番号 |
---|---|---|
004 | 6/4 | NULL |
002 | 6/2 | NULL |
003 | NULL | 001 |
001 | 6/1 | NULL |
イメージとしては履歴番号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文で実現できる方法がありましたらご教示頂けますと幸いです。
回答2件
あなたの回答
tips
プレビュー