[SQL]Как заставить ORDER BY выводить NULL в конце?
ORDER BY ISNULL(`field`) DESC - чем не подходит?
2) order by ... DESC null в конце.
Зы Кроме как тупо сделать union больше в голову ниче не приходит.
order by case when <field> is null then 1 else 0 end
2) order by ... DESC null в конце.Чего-чего?
Кроме как тупо сделать unionЗачем?
Что лучше выглядит -
ISNULL(`field`)
или
case when <field> is null then 1 else 0 end
?
>Чего-чего?
при DESC null в конец ставится.
Может у вас там в mysql и одной а у нас в MS SQL двух.1) Автор треда не сказал, какой именно SQL.
2) Ты точно не поутаешь с ifnull? Что именно эта твоя функция от двух переменных возвращает?
при DESC null в конец ставится.И что?
хочется чтобы сначала выжавал неналловые данные, а потом налловые
ISNULL ( check_expression , replacement_value )
>И что?
Формально такой запрос выполняет требования автора.
ISNULL ( check_expression , replacement_value )И что оно делает?
Формально такой запрос выполняет требования автора.И что в этом такого плохого?
кстати мне понравился такой вариант:
ORDER BY (field IS NOT NULL field
вроде это то что нужно
и выглядит проще чем у вас
и наверняка во всех субд работает
>И что в этом такого плохого?
Если автора все устраивает то ничего.
проверяет check_expression и если оно равно Null возвращает replacement_valueА если не равно - возвращает check_expression?
Ну так это действительно стандартный ifnull (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html)
очепятка
должно быть:
ORDER BY (field IS NULL field
только вот Hibernate, зараза такая, отказывается принимать такой синтаксис
а isNull нету в PostgreSQL
МS SQL такое не воспринемает.
явно это не кроссэскуэльно получается
для mysql есть isnull
для oracle и postgres есть (IS NULL) или (case when ...)
а для mssql есть хоть одно решение?
просто чиста из спортивного интереса
P.S.
есть еще COALESCE но не могу сообразить как ее сюды прикрутить
чем тебе с case'ом не понравилось-то?
есть еще COALESCE но не могу сообразить как ее сюды прикрутить
order by coalesce(field, _MIN_VALUE_ где _MIN_VALUE_ - значение, которое заведомо больше любого значения field
я уже так и сделал
ORDER BY (field IS NULL field
удовлетворяет стандарту SQL-92. Поэтому на всех СУБД, поддерживающих этот стандарт (в том числе и МС Сиквел это должно работаь.
SELECT * FROM Products
ORDER BY (ProductName IS NULL ProductName
говорит:
Incorrect syntax near the keyword 'IS'.
Поэтому либо это нифига не нужно для стандарта, либо я чегото не понимаю.
удовлетворяет стандарту SQL-92насколько я понял, в стандарте SQL92 такого нет. B SQL99 есть. MSSQL, действительно, не поддерживает булевы значения в ORDER BY.
Ты неправильно понял. Почитай спецификацию SQL-92. Там это есть. А то, что МС Сиквел не поддерживает (как оказалось) даже этот стандарт - ну, блин, его проблемы.
Ты неправильно понял.прежде чем делать такие сильные утверждения сам почитай стандарт
http://savage.net.au/SQL/
Если найдешь, что в SQL92 это есть, напиши ссылку.
Тебя носом ткнуть или сам таки найдёшь?
Там написано, что
<null predicate> ::= IS [ NOT ] NULL
а на самом деле в стандарте
<null predicate> ::= <row value constructor> IS [ NOT ] NULL
Надеюсь, не надо объяснять, что в твоей ссылке действительно ошибка?
<order by clause> ::= ORDER BY <sort specification list>
<sort specification list> ::= <sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::= <sort key> [ <collate clause> ] [ <ordering specification> ]
<sort key> ::= <column name> | <unsigned integer>
<ordering specification> ::= ASC | DESC
Скажи, пожалуйста, зачем вообще этот спор? Какая разница что написано в стандарте, если известно, что не все поддерживают это? Вместо этого, в данном случае, рулит простая проверка на каких субд работает, на каких нет.
> Тебя носом ткнуть или сам таки найдёшь?
покажи, плиз, причем определение семантики конструкции order by, а не только ее синтаксиса.
А по теме - да, насчёт IS NULL внутри ORDER BY я погорячился.
Он только внутри WHERE может быть.
Но всё равно не беда - UNION от WHERE col IS NOT NULL и WHERE col IS NULL решает поставленную задачу.
Скажи, пожалуйста, зачем вообще этот спор?Ща выяснится у кого длиннее познание в стандартах, и все будет тип-топ.
Но всё равно не беда - UNION от WHERE col IS NOT NULL и WHERE col IS NULL решает поставленную задачу.Это еще в третьем посте было предложено.
Обращение к стандарту - служит для решения одной из стандартных проблем, а именно для решения "комбинаторного взврыва".
в данном случае, к такому "взрыву" приводят: кол-во фич * кол-во реализаций.
при обращений к стандарту кол-во вариантов сокращается:
кол-во фич * кол-во стандартов + кол-во стандартов * кол-во реализаций.
Да, да! После долгих поисков мы снова пришли к единственно верному переносимому решению! Ура!
кол-во фич * кол-во стандартов + кол-во стандартов * кол-во реализаций.
Странная немного формула, надо признать. Потому что оказывается, что лучше всего жить, если кол-во стандартов = 0. Хотя идея понятна
да, да, надо еще расмотреть дробные и комплексные кол-ва стандартов.
а если серьезно, то нулевое кол-во стандартов не решает вышепоставленной задачи: фичу стоит юзать или нет.
если в качестве стандарта понимать - "входит в спецификацию и реализовано на большинстве реализаций", то такой вопрос не стоит.
именно такое определение стандарта обычно используется на практике.
Но всё равно не беда - UNION от WHERE col IS NOT NULL и WHERE col IS NULL решает поставленную задачу.1. Порядок запросов в UNION-е не гарантирует правильный порядок результата запроса. Если идти по твоему варианту, то придется вводить дополнительный столбец и делать еще один внешний запрос, в котором указать ORDER BY. Но тогда проще не через UNION, а через CASE
SELECT <FieldList>
FROM
(SELECT
<FieldList>,
CASE
WHEN Name IS NULL THEN 1
ELSE 0
END AS SortOrder
FROM Product) T1
ORDER BY SortOrder, Field1
Этот запрос вроде соответствует стандарту SQL92.
И самое главное, запрос с IS NULL в конструкции WHERE неоправданная потеря в производительности:
For best performance, and to reduce bugs, columns should ideally be set to NOT NULL. For example, use of the IS NULL keywords in the WHERE clause makes that portion of the query non-sargable, which means that portion of the query cannot use an index. [6.5, 7.0, 2000] Updated 10-29-2004.
http://www.sql-server-performance.com/datatypes.asp
В MSSQL-е CASE можно указывать в самом ORDER BY, т.е. вот такой запрос будет вполне кросСУБДешный
SELECT *
FROM Product
ORDER BY
CASE
WHEN Name IS NULL THEN 1
ELSE 0
END,
Field1
Оставить комментарий
pitrik2
тоесть хочется чтобы сначала выжавал неналловые данные, а потом налловыев настроках базы или клиента возможно есть такое, но это не то
хочется именно так селект построить
ИМХО никак
но вдруг кто знает?