Описание в условном ПОРЯДКЕ SQLite ПО

#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|
  

Это довольно сложно (и, вероятно, медленно) упорядочить в одном запросе