|
|
|
| Есть столбец:
NUMBER
3
4
5
NULL
2
1
NULL
6
Мне его нужно отсортировать по возрастанию, но чтобы NULL были последние, т.е. должно получиться:
NUMBER
1
2
3
4
5
6
NULL
NULL
Обычная сортировка ORDER BY NUMBER на первое место ставит NULL, а потом только числа | |
|
|
|
|
|
|
|
для: zsaz
(15.12.2010 в 05:07)
| | попробуйте так:
... ORDER BY NUMBER WHEN `название столбца`='NULL' THEN 1 ELSE 0 END, `название столбца` ...
|
| |
|
|
|
|
|
|
|
для: lightning.say
(15.12.2010 в 06:45)
| | Не работает. сделал так:
SELECT * FROM `users` WHERE 1 ORDER BY `number` WHEN `number`='NULL' THEN 1 ELSE 0 END | |
|
|
|
|
|
|
|
для: zsaz
(15.12.2010 в 08:44)
| | не все-таки это не то... | |
|
|
|
|
|
|
|
для: zsaz
(15.12.2010 в 08:44)
| |
SELECT *
FROM `users`
ORDER BY
CASE number
WHEN `number` IS NULL
THEN 1
ELSE 0
END
|
| |
|
|
|
|
|
|
|
для: Лена
(15.12.2010 в 11:38)
| | Вообще-то тут каша накручена order by((number == isnull(number)) ? 1 : 0)
Можно было бы написать так
SELECT *
FROM `users`
ORDER BY
CASE
WHEN `number` IS NULL THEN 1999999999
ELSE number
END
|
но это коряво. И предполагает что чисел выше 1999999999 в столбике не встретится.
Проще и корректнее так:
SELECT *
FROM `users`
ORDER BY
`number` IS NULL DESC,
`number` ASC
|
| |
|
|
|
|
|
|
|
для: Trianon
(15.12.2010 в 12:52)
| | а вы работу их проверяли?
первый
3
1
5
2
1
6
(NULL)
(NULL)
второй
(NULL)
(NULL)
1
2
3
4
5
6
а надо что бы (NULL) в конце было а не в начале | |
|
|
|
|
|
|
|
для: lightning.say
(15.12.2010 в 13:02)
| | нет, конечно - я принцип показал.
DESC на ASC изменить - и всё нормально будет.
или вообще модификаторы убрать:
SELECT *
FROM `users`
ORDER BY `number` IS NULL , `number`
|
| |
|
|
|
|
|
|
|
для: Trianon
(15.12.2010 в 13:11)
| | Мне больше нравится
SELECT *
FROM `users`
ORDER BY `number` DESC , `number` IS NULL
|
Так понятней, что сначала выбираем number, а после неопределенные number. | |
|
|
|
|
|
|
|
для: Лена
(15.12.2010 в 13:50)
| | не выйдет. человеку по возрастанию нужно. | |
|
|
|
|
|
|
|
для: Лена
(15.12.2010 в 13:50)
| | и принцип.
ORDER BY a,b,c означает не "сперва выбираем a, затем b, и под конец с"
Оно означает "
выражение a влияет на выбор первым. Если все значения a отличаются - определяемся по ним.
Если имеются строки с равными значениями a, то эти строки придется расставить, учитывая различие значений b.
И если остались строки в которых совпали и a и b - только тогда смотрим на c.
Строки, в которых совпала вся тройка, останутся расположены произвольным образом - в неопределенном порядке.
" | |
|
|
|
|
|
|
|
для: Trianon
(15.12.2010 в 14:13)
| | Спасибо за объяснение, поняла.
А что происходит в случае, когда в сортируемом поле значения IS NULL?
SELECT *
FROM `users`
ORDER BY `number` IS NULL
Все значения неопределены, сортировка по идее ж не должна происходить. Как можно сортировать то, что не определено? Тем не менее в этом случае заполненные значения - в начале выборки, а значения IS NULL - последние. | |
|
|
|
|
|
|
|
для: Лена
(15.12.2010 в 21:38)
| | в сортируемом поле совсем не значение IS NULL, а вовсе даже значение вычисляемого выражения (expr IS NULL) , которое равно единице при неопределенном expr (сиречь при пустом поле), либо равно нулю при определенном expr (заполненном поле). Вот эти 0 и 1 и сортируются.
Поскольку 0 < 1 - сперва следуют заполненные поля, а потом незаполненные.
Поскольку меж собой нолики и единички равны - внутри самих групп никакого порядка никто не гарантировал. | |
|
|
|
|
|
|
|
для: Trianon
(15.12.2010 в 21:44)
| | у меня сомнения в понимании вот этой фразы:
вовсе даже значение вычисляемого выражения (expr IS NULL) , которое равно единице при неопределенном expr (сиречь при пустом поле), либо равно нулю при определенном expr (заполненном поле).
т.е. сначала вычисляется выражение, идущее после оператора ORDER BY - number IS NULL.
Если в данной ячейке значение неопределенное - значение выражения true,получаем 1,
если в ячейке значение непустое - получаем false, 0.
Спасибо, что разжевываете, случай интересный, первый раз такое вижу. | |
|
|
|
|
|
|
|
для: Лена
(16.12.2010 в 00:09)
| | да. именно так.
логические true и false в MySQL эквивалентны числовым 1 и 0
единственное number - вовсе не обязательно имено ячейка - это тоже в самом общем случае - выражение, может быть формулой, полем, константой наконец.
Константа, впрочем, конкретно в ORDER BY - не пришей кобыле хвост.
Но никто ж немешает написать
SELECT NULL IS NULL;
SELECT 1 IS NULL;
SELECT 1/0 IS NULL;
SELECT 0/1 IS NULL;
|
| |
|
|
|
|
|
|
|
для: Trianon
(16.12.2010 в 00:38)
| | >Константа, впрочем, конкретно в ORDER BY - не пришей кобыле хвост.
Почему? ORDER BY 1,2 - потому что неясно, по каким полям сортируется?
>Но никто ж немешает написать
>
SELECT NULL IS NULL;
>SELECT 1 IS NULL;
>SELECT 1/0 IS NULL;
>SELECT 0/1 IS NULL;
>
|
Такое на практике редко встречается. | |
|
|
|
|
|
|
|
для: Лена
(16.12.2010 в 14:23)
| | ORDER BY 1,2 это неортогональное исключение из правила.
Здесь 1, 2 не выражения агрегата сортировки, а номера колонок.
По всем канонам, за такое исключение автора соответствующей конструкции языка следовало бы выпороть на конюшне (хотя бы потому, что по большому счету, как реляционное отношение не зависит от порядка атрибутов, так и работа БД-приложения не должна зависеть от порядка колонок в таблице). Но языки частенько пишут неспециалисты... | |
|
|
|
|
|
|
|
для: Trianon
(15.12.2010 в 13:11)
| | Спасибо! Данный способ заработал.
SELECT * FROM users ORDER BY `number` IS NULL, `number`
|
| |
|
|
|