每条记录包含两个字段 - field1和field2。两者都包含日期。
对于到达记录:可能已填写1个字段,而另一个字段可能是2个字段或根本没有。
我希望以最有效的方式根据此订购它们。
因此,它会将field1和field2与记录进行比较,并找出哪一个具有最新日期。然后它将根据此顺序列出所有记录,然后显示不具有任何类型条目的记录。
我按照这样的方式对它进行了排序:
order("CASE WHEN field1 IS NULL THEN 1 ELSE 0 END, field1 desc"
但是当我尝试将字段2引入查询时,它并没有给出我期望的结果。
有什么想法吗?
答案 0 :(得分:1)
按日期GREATEST
排序,并添加NULLS LAST
以将两个日期的行设置为最后NULL
:
[local] #= CREATE TEMP TABLE t (d1 date, d2 date, id serial);
CREATE TABLE
Time: 25,122 ms
[local] #= INSERT INTO t VALUES
(now(), now() - '1 day'::interval),
(now(), NULL),
(NULL, now() - '1 day'::interval),
(NULL, NULL)
;
INSERT 0 4
Time: 1,194 ms
[local] #= SELECT * FROM t;
┌────────────┬────────────┬────┐
│ d1 │ d2 │ id │
├────────────┼────────────┼────┤
│ 2016-06-23 │ 2016-06-22 │ 1 │
│ 2016-06-23 │ (null) │ 2 │
│ (null) │ 2016-06-22 │ 3 │
│ (null) │ (null) │ 4 │
└────────────┴────────────┴────┘
(4 rows)
[local] #= SELECT * FROM t ORDER BY GREATEST(d1, d2) DESC NULLS LAST;
┌────────────┬────────────┬────┐
│ d1 │ d2 │ id │
├────────────┼────────────┼────┤
│ 2016-06-23 │ 2016-06-22 │ 1 │
│ 2016-06-23 │ (null) │ 2 │
│ (null) │ 2016-06-22 │ 3 │
│ (null) │ (null) │ 4 │
└────────────┴────────────┴────┘
(4 rows)
答案 1 :(得分:0)
我对SQL查询的理解一般是排序将是一个,然后是两个,你不能按一个字段排序而不能按另一个排序。
我这样做的方法是在数据库列中创建第3列(并不是那么难),调用sort_date
。编写一个比较date1和date2的after_update
方法,并根据您想要的比较条件设置sort_date
。 (根据其他代码,可能还需要sort_date
的默认值)。然后重新编写您的查询以按sort_date