#sql #sqlite
#sql #sqlite
Вопрос:
Мне нужно выбрать записи, упорядоченные по следующей логике, однако SQLite выдает ошибку, когда DESC находится в условном порядке.
ORDER BY
CASE
WHEN parentGUID IS NULL THEN datePosted DESC
ELSE datePosted
END
Это делается для достижения Facebook, подобного ordering =- original posts (которые всегда имеют null parentGUIDs) в порядке убывания по дате, и ответов на исходные сообщения, упорядоченные по возрастанию даты.
Комментарии:
1. вы не можете переключать порядок по направлению для каждой строки в зависимости от значения столбца.
2. Непонятно, что вы пытаетесь сделать. Вы хотите сортировать разные строки по-разному?
3. Я обновил свой «ответ». Если вы хотите сделать то, что я описываю, тогда я сдаюсь, кажется, довольно сложно выполнить в одном запросе 🙂
Ответ №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.
Комментарии:
1. О, спасибо Лукасу за разъяснение намерения OP, надеюсь, вы не возражаете, что я позаимствовал ваши образцы данных!
2. 1 FWIW, это
CASE ... END DESC
также может быть выражено какCOALESCE(Parent.datePosted, Post.datePosted) DESC
Ответ №2:
С вашей поправкой, я думаю, что теперь понимаю. Вот несколько примеров данных
|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|
Это довольно сложно (и, вероятно, медленно) упорядочить в одном запросе