2

我正在整理一张桌子。小提琴可以在这里找到。

CREATE TABLE test
(
field date NULL
);

INSERT INTO test VALUES
('2000-01-05'),
('2004-01-05'),
(NULL),
('2008-01-05');

SELECT * FROM test ORDER BY field DESC;

我得到的结果:

2008-01-05
2004-01-05
2000-01-05
(null)

但是我需要结果是这样的:

(null)
2008-01-05
2004-01-05
2000-01-05

因此 NULL 值被视为高于任何其他值。有可能这样做吗?

4

3 回答 3

4

使用“时间结束”标记替换空值:

SELECT * FROM test 
ORDER BY ISNULL(field, '9999-01-01') DESC; 
于 2012-06-08T09:55:06.150 回答
4

最简单的方法是先添加一个额外的排序条件:

ORDER BY CASE WHEN field is null then 0 else 1 END,field DESC

或者,您可以尝试将其设置为其数据类型的最大值:

ORDER BY COALESCE(field,'99991231') DESC

COALESCE/ISNULL工作正常,前提是您没有使用相同最大值的“真实”数据。如果这样做,并且需要区分它们,请使用第一种形式。

于 2012-06-08T09:56:14.130 回答
1

小心调用每行函数的查询,它们很少能很好地扩展。

对于较小的数据集,这可能不是问题,但如果它们变得很大,就会出现问题。这应该通过定期对查询执行测试来监控。如果您的数据从不更改(非常罕见),则数据库优化只是一种设置后的操作。

有时最好引入人工主排序列,例如:

select 1 as art_id, mydate, col1, col2 from mytable where mydate is null
union all
select 2 as art_id, mydate, col1, col2 from mytable where mydate is not null
order by art_id, mydate desc

然后只result_set["everything except art_id"]在你的程序中使用。

通过这样做,您不会引入(可能)缓慢的每行函数,而是依赖于mydate列上的快速索引查找。高级执行引擎实际上可以同时运行这两个查询,并在它们都完成后将它们组合起来。

于 2012-06-08T10:05:32.277 回答