SQL ORDER BY, получить отрицательные значения в конце списка - PullRequest
0 голосов
/ 12 июня 2018

Я попытался найти решение для индивидуального заказа по функциональности.

У меня есть таблица, которую можно упростить с помощью текстового поля и целочисленного значения категории:

text      | category
----------------------
'Item 1'  | 3
'Item 2'  | -1
'Item 3'  | 2
'Item 4'  | -1
'Item 5'  | 3
'Item 6'  | 1

Целочисленное значение -1 указывает на то, что категория не используется.

Я хочу отсортировать по категории и получить значения -1 в конце, например.результат, подобный следующему:

text      | category
----------------------
'Item 6'  | 1
'Item 3'  | 2
'Item 1'  | 3
'Item 5'  | 3
'Item 2'  | -1
'Item 4'  | -1

Я не могу прикоснуться к данным, хранящимся в базе данных, и хочу избежать хранимых процедур.

Я использую Postgres 9.2.

Я попытался создать онлайн-тест здесь: https://www.db -fiddle.com / f / 6pTQgKyiJYQwHBjrx8rSWZ / 0 # & Togetherjs = PCph5kuFn1

SQL для создания тестовой таблицы:

CREATE TABLE test_order
(
text text,
category integer
);
INSERT INTO test_order values('Item 1',3);
INSERT INTO test_order values('Item 2',-1);
INSERT INTO test_order values('Item 3',2);
INSERT INTO test_order values('Item 4',-1);
INSERT INTO test_order values('Item 5',3);
INSERT INTO test_order values('Item 6',1);

Ответы [ 6 ]

0 голосов
/ 12 июня 2018
SELECT NULLIF(category, -1) as nulled_category, * 
from test_order 
ORDER BY nulled_category ASC nulls last, text;

Это то, что администратор базы данных должен был обрабатывать при проектировании базы данных.

0 голосов
/ 12 июня 2018

Если категория -1, задайте ей максимальное значение.

Обновленная скрипта здесь

SELECT
            O.text,
            O.category
    FROM
            test_order O
    ORDER BY
            CASE
                WHEN category = -1 THEN 2147483647
                ELSE category
            END,
            text;
0 голосов
/ 12 июня 2018

Postgres обрабатывает NULL наивысшим по умолчанию, поэтому это будет работать:

SELECT * 
FROM test_order 
ORDER BY NULLIF(category, -1), text;

Если вы хотите сортировать по убыванию, также поддерживаются NULLS FIRST / LAST в стандартном SQL:

ORDER BY 
   NULLIF(category, -1) DESC NULLS LAST, text

ОтносительноDISTINCT ON, вы должны использовать одно и то же выражение в DISTNCT и ORDER:

SELECT DISTINCT ON (text,NULLIF(category, -1)) text,category 
FROM test_order 
ORDER BY NULLIF(category, -1) NULLS LAST, text;

См. fiddle

0 голосов
/ 12 июня 2018

Для SQL Server вы можете использовать следующий запрос:

SELECT tor.texts, tor.category
FROM #test_order AS tor
ORDER BY REPLACE(tor.category
           , -1
           , (   SELECT MAX(category) + 1
                 FROM #test_order))
  , tor.texts;
0 голосов
/ 12 июня 2018

Другая опция использует UNION ALL

(select * from test_order
where category >= 0
Order By category)
UNION ALL
(select * from test_order
where category = -1)

Первый выбор - сортировка по порядку с оператором .Затем мы добавляем оставшиеся строки, где category = -1 , к строкам из первого выбора.

0 голосов
/ 12 июня 2018

Используйте несколько ключей в order by:

order by (category >= 0)::int desc, category asc

Когда вы преобразовываете логическое значение в целое число, значение «true» имеет значение «1» и значение «0».Отсюда использование desc для order by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...