DESite在SQLite条件ORDER BY中

时间:2011-04-29 19:05:35

标签: sql sqlite

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

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

这是为了实现Facebook的排序= - 原始帖子(总是有空的parentGUID)按日期递减,并回复按日期升序排序的原始帖子。

2 个答案:

答案 0 :(得分:5)

如果我理解正确,您需要加入具有父帖子日期的表格。如果可以的话,这样的事情应该做:

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并不是很熟悉。

答案 1 :(得分:1)

通过你的纠正,我想我现在明白了。这是一些示例数据

|GUID|parentGUID|datePosted|
+----+----------+----------+
|1   |null      |2010-01-01|
|2   |null      |2010-01-02|
|3   |1         |2010-01-03|
|4   |1         |2010-01-04|
|5   |1         |2010-01-05|
|6   |2         |2010-01-06|

我猜你想要这个输出:

|GUID|parentGUID|datePosted|
+----+----------+----------+
|1   |null      |2010-01-01|
|5   |1         |2010-01-05|
|4   |1         |2010-01-04|
|3   |1         |2010-01-03|
|2   |null      |2010-01-02|
|6   |2         |2010-01-06|

在单个查询中订购非常困难(可能很慢)