MySQL Orderby число, Nulls last

В моем заявлении я делаю очень простой OrderBy.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

Проблема заключается в том, что записи NULL для "позиции" обрабатываются как 0. Поэтому все записи с позицией NULL отображаются перед теми, у кого 1,2,3,4. например:

NULL, NULL, NULL, 1, 2, 3, 4

Есть ли способ добиться следующего порядка:

1, 2, 3, 4, NULL, NULL, NULL.

Ответ 1

MySQL имеет недокументированный синтаксис для сортировки нулей в последний раз. Поместите знак минус (-) перед именем столбца и переключите ASC в DESC:

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC

Это, по сути, обратное значение position DESC, поместив значения NULL последним, но в остальном же как position ASC.

Хорошая ссылка здесь http://troels.arvin.dk/db/rdbms#select-order_by

Ответ 2

Я нашел это хорошим решением по большей части:

SELECT * FROM table ORDER BY ISNULL(field), field ASC;

Ответ 3

Что-то вроде

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

Замените 999999999 тем, что максимальное значение для поля

Ответ 4

NULL LAST

SELECT * FROM table_name ORDER BY id IS NULL, id ASC

Ответ 5

Попробуйте использовать этот запрос:

SELECT * FROM tablename
WHERE visible=1 
ORDER BY 
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC

Ответ 6

Вы можете поменять местами NULL с другим значением для их сортировки сначала (например, 0 или -1) или последним (большое число или буква)...

SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC

Ответ 7

Вы можете coalesce ваши NULL в инструкции ORDER BY:

select * from tablename
where <conditions>
order by
    coalesce(position, 0) ASC, 
    id DESC

Если вы хотите, чтобы NULL сортировались в нижней части, попробуйте coalesce(position, 100000). (Сделайте второе число больше, чем все остальные position в db.)

Ответ 8

SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC

Ответ 9

Для столбца DATE вы можете использовать:


NULLS last:

ORDER BY IFNULL(`myDate`, '9999-12-31') ASC

Бланки последние:

ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC

Ответ 10

Для достижения следующего результата:

1, 2, 3, 4, NULL, NULL, NULL.

ИСПОЛЬЗУЙТЕ синтаксис, поместите -(minus sign) перед именем поля и используйте обратный тип_порядка (например: если вы хотите упорядочить по порядку ASC, используйте DESC или, если вы хотите порядок DESC, используйте ASC)

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC

Ответ 11

Это работает нормально:

SELECT * FROM tablename ORDER BY position = 0, position ASC;

position
1 
2
3
0
0

Ответ 12

Почему вы не заказываете NULLS LAST?

SELECT * 
FROM tablename
WHERE visible = 1 
ORDER BY position ASC NULLS LAST, id DESC