MySQL сортировочный запрос в двух столбцах со значением проверки

0

У меня есть такие данные:

===================
id | name    | year
1  | Andy    | 1993
2  | Carroll | 1987
3  | Steve   | -973
4  | John    | null
===================

Как я могу сортировать данные:

===================
id | name    | year
3  | Steve   | -973
4  | John    | null
2  | Carroll | 1987
1  | Andy    | 1993
===================

Огромное спасибо.

  • 0
    ORDER BY name DESC ?
  • 0
    @ThorstenKettner приятно думать нестандартно! :)
Теги:
mysqli

3 ответа

3

Если year не является целым типом, примените cast и coalesce:

select *
from yourtable
order by cast(coalesce(year,0) as int)

Если это целое число, достаточно одного coalesce:

select *
from yourtable
order by coalesce(year,0)

Это будет обрабатывать null значение в столбце года как 0


Почему разница? Номера в виде текста сортируются по-разному, чем цифры, и здесь вы хотите отсортировать номера.

  • 0
    его работа, но я хочу отсортировать действительный год в первом, как запрос?
  • 0
    Я не понимаю, что вы имеете в виду. Если это работает, то что еще нет? Могли бы вы объяснить? Если вам нужен обратный порядок, примените order by ... DESC ключевому слову order by ... DESC в конце
1

Отвечая на комментарий о желании сначала отсортировать год, вы можете изменить запрос:

SELECT *
FROM Table1
ORDER BY (COALESCE(year,-1) >= 0) DESC, COALESCE(year,0)

Выход:

id  name        year
2   Carroll     1987
1   Andy        1993
3   Steve       -973
4   John        (null)

COALESCE(year,-1) >= 0 вернет 1 за год> = 0 и 0 в противном случае, поэтому "действительные" годы (год> = 0) сортируют сначала в списке.

редактировать

Чтобы отсортировать (null) лет до недопустимых, измените ORDER BY на

ORDER BY (COALESCE(year,-1) >= 0) DESC, COALESCE(year,-2147483648)

Это будет обеспечивать (нулевые) значения ниже любых значений года и, таким образом, будет сортироваться перед ними.

Выход:

id  name        year
2   Carroll     1987
1   Andy        1993
4   John        (null)
3   Steve       -973
  • 0
    большое Вам спасибо. еще один вопрос, как, если я хочу отсортировать действительные годы, нулевые, а затем недействительные годы?
  • 0
    Смотрите мое редактирование. Это будет делать то, что вы хотите.
Показать ещё 7 комментариев
1

Кажется, вы хотите, чтобы year считался 0 когда он равен NULL. Если это логика:

order by coalesce(year, 0)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню