我有一個date
字段,它顯示爲今天的天數。因此2055-01-01
和1950-01-01
將分別顯示爲正數和負數。現在,我希望對這些進行排序,以便非負數字首先按升序排列,然後負數字按降序排列。例如:如何在PostgreSQL中按現在距離()(將來第一個)的距離排序
0
1
2
3
4
-1
-2
-3
我有一個date
字段,它顯示爲今天的天數。因此2055-01-01
和1950-01-01
將分別顯示爲正數和負數。現在,我希望對這些進行排序,以便非負數字首先按升序排列,然後負數字按降序排列。例如:如何在PostgreSQL中按現在距離()(將來第一個)的距離排序
0
1
2
3
4
-1
-2
-3
以下也將工作:
ORDER BY expiry < CURRENT_DATE, abs(expiry - CURRENT_DATE)
然而這種形式將不使用的索引,以產生所需的順序的行。如果您的查詢就會從中受益(大部分選擇行從表或使用限制),那麼你就需要使用一個聯盟:如果您substitue「我」爲
SELECT ... WHERE ... AND expiry >= CURRENT_DATE ORDER BY expiry
UNION ALL
SELECT ... WHERE ... AND expiry < CURRENT_DATE ORDER BY expiry DESC
我by子句周圍砍死這樣的順序:
ORDER BY CASE expiry >= CURRENT_DATE
WHEN true THEN expiry
ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
END
由於日期是在幾年的今天之內,它的安全負日期的方式推入未來。然後它們與當前日期的距離相反。
它的工作原理,但更優雅的解決方案會很好。
select * from @t
order by
case when i >= 0 then 0 else 1 end,
case when i >= 0 then i else abs(i) end
您差異計算和@噸爲您的表這應該工作
+1當然!我最終使用了第一種解決方案,因爲查詢時間很長,現在速度可以接受。 – l0b0