Sql 根据两个日期列进行排序
我正在使用Postgresql 10,并尝试对我的select查询进行排序,使其位于两个日期列之间的较小日期之上 这是一个 有序结果如下所示:Sql 根据两个日期列进行排序,sql,postgresql,Sql,Postgresql,我正在使用Postgresql 10,并尝试对我的select查询进行排序,使其位于两个日期列之间的较小日期之上 这是一个 有序结果如下所示: +----+--------------+--------------+ | id | column1_date | column2_date | +----+--------------+--------------+ | 1 | 2018-05-07 | null | +----+--------------+---------
+----+--------------+--------------+
| id | column1_date | column2_date |
+----+--------------+--------------+
| 1 | 2018-05-07 | null |
+----+--------------+--------------+
| 3 | null | 2018-05-28 |
+----+--------------+--------------+
| 2 | 2018-06-28 | 2018-06-30 |
+----+--------------+--------------+
| 4 | null | 2018-07-12 |
+----+--------------+--------------+
SELECT * FROM Test
ORDER BY
CASE WHEN column1_date is null AND column2_date is not null
THEN column2_date END ASC, column1_date ASC,
CASE WHEN column1_date is not null AND column2_date is null
THEN column1_date END ASC, column2_date ASC,
CASE WHEN column1_date is not null AND column2_date is not null AND column1_date < column2_date
THEN column1_date END ASC, column2_date ASC,
CASE WHEN column1_date is not null AND column2_date is not null AND column1_date > column2_date
THEN column2_date END ASC, column1_date ASC
我试着这样做:
+----+--------------+--------------+
| id | column1_date | column2_date |
+----+--------------+--------------+
| 1 | 2018-05-07 | null |
+----+--------------+--------------+
| 3 | null | 2018-05-28 |
+----+--------------+--------------+
| 2 | 2018-06-28 | 2018-06-30 |
+----+--------------+--------------+
| 4 | null | 2018-07-12 |
+----+--------------+--------------+
SELECT * FROM Test
ORDER BY
CASE WHEN column1_date is null AND column2_date is not null
THEN column2_date END ASC, column1_date ASC,
CASE WHEN column1_date is not null AND column2_date is null
THEN column1_date END ASC, column2_date ASC,
CASE WHEN column1_date is not null AND column2_date is not null AND column1_date < column2_date
THEN column1_date END ASC, column2_date ASC,
CASE WHEN column1_date is not null AND column2_date is not null AND column1_date > column2_date
THEN column2_date END ASC, column1_date ASC
但这并不成功。
我错过了什么
谢谢您可以使用
ORDER BY least(coalesce(column1_date, DATE 'infinity'),
coalesce(column2_date, DATE 'infinity'))
这将始终使用两者中较小的一个
如果两列都为空,则该行将最后排序。您可以使用
ORDER BY least(coalesce(column1_date, DATE 'infinity'),
coalesce(column2_date, DATE 'infinity'))
这将始终使用两者中较小的一个
如果两列都为空,则该行将最后排序。您可以使用内部子查询:
select
t.id, t.column1_date, t.column2_date
from (
select
id,
column1_date,
column2_date,
CASE
WHEN column1_date is null then column2_date
WHEN column2_date is null then column1_date
WHEN column1_date < column2_date THEN column1_date
ELSE column2_date
END AS min_date
from Test) as t
order by t.min_date;
您可以使用内部子查询:
select
t.id, t.column1_date, t.column2_date
from (
select
id,
column1_date,
column2_date,
CASE
WHEN column1_date is null then column2_date
WHEN column2_date is null then column1_date
WHEN column1_date < column2_date THEN column1_date
ELSE column2_date
END AS min_date
from Test) as t
order by t.min_date;