Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据两个日期列进行排序_Sql_Postgresql - Fatal编程技术网

Sql 根据两个日期列进行排序

Sql 根据两个日期列进行排序,sql,postgresql,Sql,Postgresql,我正在使用Postgresql 10,并尝试对我的select查询进行排序,使其位于两个日期列之间的较小日期之上 这是一个 有序结果如下所示: +----+--------------+--------------+ | id | column1_date | column2_date | +----+--------------+--------------+ | 1 | 2018-05-07 | null | +----+--------------+---------

我正在使用Postgresql 10,并尝试对我的select查询进行排序,使其位于两个日期列之间的较小日期之上

这是一个

有序结果如下所示:

+----+--------------+--------------+
| 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;