一尘不染

SQLite条件ORDER BY中的DESC

sql

我需要选择按以下逻辑排序的记录,但是当DESC处于条件条件时,SQLite会引发错误。

ORDER BY
CASE 
  WHEN parentGUID IS NULL THEN datePosted DESC
  ELSE datePosted
END

这是为了实现Facebook的排序,即按日期降序排列=-原始帖子(始终具有空的parentGUID),并按日期升序答复原始帖子。


阅读 389

收藏
2021-03-08

共1个答案

一尘不染

如果我理解正确,那么您将需要加入具有父帖子日期的表格。如果可用,则应执行以下操作:

DECLARE @X TABLE
(
ID  INT NOT NULL IDENTITY PRIMARY KEY,
parentID INT,
datePosted DATE NOT NULL
)
INSERT INTO @X (parentID, datePosted) VALUES
    (NULL, '2010-01-01'),
    (NULL, '2010-01-02'),
    (1,    '2010-01-03'),
    (1,    '2010-01-04'),
    (1,    '2010-01-05'),
    (2,    '2010-01-06')

SELECT
    Post.parentID, Post.datePosted
FROM @X AS Post
    LEFT JOIN @X AS Parent ON Post.parentID = Parent.ID
ORDER BY
    -- Order by post date, or rather the parent's post date if one exists
    COALESCE(Parent.datePosted, Post.datePosted)
    -- Order by reply date
    Post.datePosted

这给出了以下输出:

parentID datePosted
-------- ----------
NULL     2010-01-02
2        2010-01-06
NULL     2010-01-01
1        2010-01-03
1        2010-01-04
1        2010-01-05

请注意,如果回复可以依次包含回复,则此操作会中断;您需要更强大的功能。在MS SQL中,我会使用CTE,但对Sqlite不太熟悉。

2021-03-08