Как сделать нулевые значения последними при сортировке с несколькими столбцами в SQL? - PullRequest
0 голосов
/ 17 января 2019
CREATE TABLE #sorttest (test int, test2 int)

INSERT INTO #sorttest 
VALUES (1, 2), (5, 4), (4, 3), (NULL, 1),
       (3, NULL), (2, 5)

SELECT *
FROM #sorttest
ORDER BY    
    CASE WHEN test IS NULL THEN 1 ELSE 0 END, test DESC

DROP TABLE #sorttest

Как отсортировать вывод так, чтобы для обоих столбцов NULL был последним?

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 января 2019
DECLARE @sorttest TABLE ( test1 INT, test2 INT)

INSERT INTO @sorttest values
(1,2),(5,4),(4,3),(NULL,1),(3,null),(2,5)

DECLARE @temp1 TABLE ( ID1 INT IDENTITY(1,1) PRIMARY KEY, test3 INT )
DECLARE @temp2 TABLE ( ID2 INT IDENTITY(1,1) PRIMARY KEY, test4 INT )

INSERT INTO @temp1
SELECT test1 FROM @sorttest ORDER BY test1 DESC

INSERT INTO @temp2
SELECT test2 FROM @sorttest ORDER BY test2 DESC

SELECT test3, test4 FROM @temp1 t1
LEFT JOIN @temp2 t2 ON t1.ID1 = t2.ID2

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

Если вам нужно переставить значения в строке, требуется больше логики, чем один оператор выбора.

ВЫВОД:

test3   test4
5       5
4       4
3       3
2       2
1       1
NULL    NULL
0 голосов
/ 17 января 2019

вы могли бы сделать это

SELECT * FROM #sorttest ORDER BY
CASE WHEN test IS NULL and test2 is null THEN 2 ELSE 
   case when test is null or test2 is null then 1 end 
   END ,test desc

но тогда порядок ненулевого столбца будет немного нечетным

...