(select * from users where mail is not NULL)
UNION
(select * from users where mail is NULL)
order by mail
не могу разобраться с UNION
Простая задача, но что-то не могу разобраться. Есть таблица, в которой есть некоторая колонка типа varchar, которая к тому же может принимать значение NULL. Нужно ее отсортировать, чтобы значения с NULL выводились в конце. OREDER BY сначала выводить записи с NULL, а затем все остальное. Собтвено это первый вопрос.
Попробовал это решить с помощь UNION, т.е. так
Код:
(select * from users where mail is not NULL order by mail)
UNION
(select * from users where mail is NULL);
UNION
(select * from users where mail is NULL);
но почему-то в первой части запроса order by не срабатывает, но если сделать так:
Код:
(select * from users where mail is not NULL order by mail limit 1000)
UNION
(select * from users where mail is NULL);
UNION
(select * from users where mail is NULL);
то все ок. почему?
Сервер какой? В Oracle допустим синтаксис "order by mail nulls fisrt" или "nulls last". Не знаю, входит ли он в какой-либо стандарт.
Ссори, забыл. Сервер - MySQL.
"nulls first", "nulls last" - не работает :(
Код:
(select * from users where mail is not NULL order by mail)
UNION
(select * from users where mail is NULL);
UNION
(select * from users where mail is NULL);
Код:
(select * from users where mail is not NULL order by mail limit 1000)
UNION
(select * from users where mail is NULL);
UNION
(select * from users where mail is NULL);
то все ок. почему?[/QUOTE]
order by должен применятся для всего UNION блока а не для каждой его части вотдельности:
Код:
почему у тебя работает вариант с limit - без понятия.
Цитата:
ORDER BY for individual SELECT statements within parentheses only has an effect when combined with LIMIT. Otherwise, the ORDER BY is optimized away.
А как вывести записи с NULL после отсортированых, так и не нашел :(
А сделать два отдельных запроса нельзя?
Код:
SELECT * FROM mytable
order by
case when MyField is null then char(255) end,
case when MyField is not null then MyField end
order by
case when MyField is null then char(255) end,
case when MyField is not null then MyField end
Думаю идея понятна...