Порядок по целому с пустыми полями внизу - PullRequest
3 голосов
/ 03 июня 2009

В настоящее время мы переписываем нашу CMS и хотим, чтобы наши клиенты могли переупорядочивать элементы в таблице, используя поле «позиция». Так, если они помечают элементы как позицию 1, они идут вверху, затем позиция 2 под ней и т. Д.

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

Авто - 1

Байк - 2

Дом

Компьютер

Собака

Это вызывает проблему, потому что если вы используете следующий SQL ...

SELECT ProductName FROM Products ORDER BY Position DESC;

Все пустые идут вверх, а не вниз.

Можно ли разместить их в правильном порядке с помощью оператора SQL?

Ответы [ 4 ]

15 голосов
/ 03 июня 2009
SELECT ProductName
FROM Products
ORDER BY
  CASE WHEN Position is null THEN 1 ELSE 0 END,
  Position

Если вы хотите упорядочить по убыванию позиции при сохранении нулей внизу, это будет сделано:

ORDER BY
  CASE WHEN Position is null THEN 1 ELSE 0 END,
  Position desc

Если вам нужна последовательная сортировка (возможно, вы выполняете разбиение на страницы), добавьте ProductName или ProductID в конце, чтобы разорвать все связи между неупорядоченными продуктами.

ORDER BY
  CASE WHEN Position is null THEN 1 ELSE 0 END,
  Position,
  ProductID
2 голосов
/ 03 июня 2009
SELECT  ProductName
FROM    Products
ORDER BY
        COALESCE(position, (SELECT MAX(position) + 1 FROM Products))

В качестве альтернативы вы можете использовать:

SELECT  *
FROM    (
        SELECT  ProductName
        FROM    Products
        WHERE   position IS NOT NULL
        ORDER BY
                position
        ) q
UNION ALL
SELECT  ProductName
FROM    Products
WHERE   position IS NULL

Это будет более эффективно, так как первый подзапрос будет использовать индекс для position для порядка, если он есть.

0 голосов
/ 03 июня 2009

Используйте NULL только при необходимости

Вы можете легко исключить использование пустых значений и возникающую проблему сортировки, установив по умолчанию "unset" строки в целочисленное максимальное значение:

  • ОБНОВЛЕНИЕ Продукты SET Позиция = 2147483647 ГДЕ Позиция НЕДЕЙСТВИТЕЛЬНА
  • установите для столбца NOT NULL, добавьте значение по умолчанию 2147483647
  • используйте ваш ORDER BY по назначению
  • в вашем приложении или в вашем запросе на загрузку подавить отображение любого значения 2147483647

вот пример загрузки:

SELECT 
    ProductName
        ,CASE
             WHEN Position=2147483647 THEN NULL  --or cast this as a varchar and use 'N/A'
             ELSE Position
         END
    FROM ...

Если вы должны использовать нули, сделайте это следующим образом:

SELECT
    ProductName
        ,Position
    FROM Test
    ORDER BY COALESCE(Position,2147483647)
0 голосов
/ 03 июня 2009

Это должно сделать всю работу за вас.

CREATE TABLE [dbo].[Test](
    [Position] [int] NULL,
    [Title] [varchar](15) NULL
) 
GO

INSERT INTO Test Values(1, 'P1')
INSERT INTO Test Values(2, 'P2')
INSERT INTO Test Values(NULL, 'P3')
INSERT INTO Test Values(NULL, 'P4')
INSERT INTO Test Values(NULL, 'P5')
GO

SELECT Title + ' - ' +  CASE  
    WHEN POSITION IS NULL THEN ''
    ELSE CAST(Position AS CHAR(3))
    END
FROM Test
ORDER BY CASE WHEN Position is null THEN 1 ELSE 0 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...