У меня есть такие данные:
===================
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
===================
Огромное спасибо.
Если 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
Почему разница? Номера в виде текста сортируются по-разному, чем цифры, и здесь вы хотите отсортировать номера.
order by ... DESC
ключевому слову order by ... DESC
в конце
Отвечая на комментарий о желании сначала отсортировать год, вы можете изменить запрос:
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
Кажется, вы хотите, чтобы year
считался 0
когда он равен NULL
. Если это логика:
order by coalesce(year, 0)
ORDER BY name DESC
?