SQLite - COALESCE中断结果顺序

时间:2016-05-21 02:22:22

标签: sql sqlite

我有一个SQLite表(用于消息)。该表有两列订单:createdsent。我需要按sent字段(下降)排序结果,但如果有0,则按created字段(也是下降)。

我使用的是SQL函数COALESCE,但结果的顺序是错误的。

正常结果(没有COALESCE):

SELECT * FROM messages ORDER BY sent DESC
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │ 1463793493 │ <-
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
└─────────────┴──────────┴────────────┴────────────┘

错误的结果(使用COALESCE):

SELECT * FROM messages ORDER BY COALESCE(sent,created)=0 DESC
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │ 1463793493 │ <-
└─────────────┴──────────┴────────────┴────────────┘

我尝试删除表达式=0,然后订单是正确的,但如果sent = 0该请求无法正常工作:

SELECT * FROM messages ORDER BY COALESCE(sent,created) DESC
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │ 1463793493 │ <-
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
└─────────────┴──────────┴────────────┴────────────┘
but
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │     0      │ <-
└─────────────┴──────────┴────────────┴────────────┘

有谁知道它为什么会发生以及如何解决它?

2 个答案:

答案 0 :(得分:2)

COALESCE处理NULL,它不会帮助你。它将始终返回sent给您。如果将其结果与零进行比较,则仅根据sent是否为零进行排序。您必须使用CASE

... ORDER BY CASE sent WHEN 0 THEN created ELSE sent END DESC;

如果您在没有时间戳的地方有NULL,那么您可以在没有比较的情况下使用COALESCE

答案 1 :(得分:0)

COALESCE处理NULL,而不是零。

您可以使用nullif() function

将零值转换为NULL
SELECT * FROM messages ORDER BY COALESCE(NULLIF(sent,0),created) DESC;