2017-01-19 9 views
0

2つの日付フィールドを持つテーブルから最も早い日付のみを取得したいというクエリを表示しています。両方の日付フィールドがNULLである可能性があります。しかし、フィールドの少なくとも1つがnullでない場合にのみ、値を取得したい。また、最初の日付フィールドがnullでない場合は、その値が必要です。言い換えれば、私は最初の日付フィールドを好む。複数の日付フィールドのPostgreSQL caseステートメント

これは私が思いついたものですが、100%これが正しいとは感じません。そして、私はまた、有名な猫を肌にさらす良い方法があると考えています。

Select 
o.order_num, 
Case 
    when ro.pay1_date is not null then ro.pay1_date 
    when ro.pay2_date is not null then ro.pay2_date 
End as funding_date 
From orders o 
left join recon_order ro on(ro.order_id = o.order_id) 
Where (ro.pay1_date is not null or ro.pay2_date is not null) 
Order by funding_date desc 
Limit 500 

私が最初にWhere句なしでこのクエリを実行しましたが、それはちょうど私が完全に理解していなかった500のNULL値を、返されました。

私はPostgreSQL 8.1の古いバージョン(私の選択ではありません)で作業しています。しかし、古いバージョンが特定の新しいクエリ構文をサポートしていない可能性があるため、これを伝えるだけです。

これを修正または改善する入力をお寄せいただきありがとうございます。

答えて

1

leastを使用すると、2つの日付のうちの最小のものを取得できます。両方ともnullの場合、nullを返します。後でnull行をフィルタリングできます。

SELECT * 
FROM 
    (SELECT o.order_num, 
      least(ro.pay1_date,ro.pay2_date) as funding_date 
    FROM orders o 
    LEFT JOIN recon_order ro ON ro.order_id = o.order_id) x 
WHERE funding_date IS NOT NULL 
+0

クールです。また、私のクエリと同じ結果が得られます。しかし、あなたのバージョンはより効率的ですか?それが本質的に優れていると言えることはありますか? – Roberto

+1

あなたのクエリよりも改善されています..両方の日付がnullでない場合、クエリはdate1を出力します(date2より大きい場合でも)。これはcase式の最初の条件であり、条件はチェックされません。 –

+0

私は日付1は、この例では、それがヌルではないが、残念ながら安全であることがより良いので、もう一度ありがとうございます。 – Roberto

関連する問題