[SQL]Как заставить ORDER BY выводить NULL в конце?

pitrik2

тоесть хочется чтобы сначала выжавал неналловые данные, а потом налловые
в настроках базы или клиента возможно есть такое, но это не то
хочется именно так селект построить
ИМХО никак
но вдруг кто знает?

kruzer25

ORDER BY ISNULL(`field`) DESC - чем не подходит?

timefim

1) isnull функия двух переменных
2) order by ... DESC null в конце.
Зы Кроме как тупо сделать union больше в голову ниче не приходит.

fedya

order by case when <field> is null then 1 else 0 end

kruzer25

Функция двух переменных - ifnull, isnull - функция одной (http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html)
2) order by ... DESC null в конце.
Чего-чего?
Кроме как тупо сделать union
Зачем?

kruzer25

Да вы извращенцы
Что лучше выглядит -
ISNULL(`field`)

или
case when <field> is null then 1 else 0 end

?

timefim

Может у вас там в mysql и одной а у нас в MS SQL двух.
>Чего-чего?
при DESC null в конец ставится.

kruzer25

Может у вас там в mysql и одной а у нас в MS SQL двух.
1) Автор треда не сказал, какой именно SQL.
2) Ты точно не поутаешь с ifnull? Что именно эта твоя функция от двух переменных возвращает?
при DESC null в конец ставится.
И что?
хочется чтобы сначала выжавал неналловые данные, а потом налловые

timefim

2)Syntax
ISNULL ( check_expression , replacement_value )
>И что?
Формально такой запрос выполняет требования автора.

kruzer25

ISNULL ( check_expression , replacement_value )
И что оно делает?
Формально такой запрос выполняет требования автора.
И что в этом такого плохого?

pitrik2

о!
кстати мне понравился такой вариант:
ORDER BY (field IS NOT NULL field
вроде это то что нужно
и выглядит проще чем у вас
и наверняка во всех субд работает

timefim

проверяет check_expression и если оно равно Null возвращает replacement_value
>И что в этом такого плохого?
Если автора все устраивает то ничего.

kruzer25

проверяет check_expression и если оно равно Null возвращает replacement_value
А если не равно - возвращает check_expression?
Ну так это действительно стандартный ifnull (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html)

pitrik2

упс
очепятка
должно быть:
ORDER BY (field IS NULL field
только вот Hibernate, зараза такая, отказывается принимать такой синтаксис
а isNull нету в PostgreSQL

timefim

МS SQL такое не воспринемает.

pitrik2

хех
явно это не кроссэскуэльно получается
для mysql есть isnull
для oracle и postgres есть (IS NULL) или (case when ...)
а для mssql есть хоть одно решение?
просто чиста из спортивного интереса
P.S.
есть еще COALESCE но не могу сообразить как ее сюды прикрутить

gopnik1994

чем тебе с case'ом не понравилось-то?

zya369

есть еще COALESCE но не могу сообразить как ее сюды прикрутить

order by coalesce(field, _MIN_VALUE_ где _MIN_VALUE_ - значение, которое заведомо больше любого значения field

pitrik2

да
я уже так и сделал

Flack_bfsp

Что значит МС Сиквел такое не воспринимает? Это:
 ORDER BY (field IS NULL field  

удовлетворяет стандарту SQL-92. Поэтому на всех СУБД, поддерживающих этот стандарт (в том числе и МС Сиквел это должно работаь.

timefim

На такой запрос:
SELECT * FROM Products
ORDER BY (ProductName IS NULL ProductName

говорит:
Incorrect syntax near the keyword 'IS'.
Поэтому либо это нифига не нужно для стандарта, либо я чегото не понимаю.

6yrop

удовлетворяет стандарту SQL-92
насколько я понял, в стандарте SQL92 такого нет. B SQL99 есть. MSSQL, действительно, не поддерживает булевы значения в ORDER BY.

Flack_bfsp

Ты неправильно понял. Почитай спецификацию SQL-92. Там это есть. А то, что МС Сиквел не поддерживает (как оказалось) даже этот стандарт - ну, блин, его проблемы.

6yrop

Ты неправильно понял.
прежде чем делать такие сильные утверждения сам почитай стандарт
http://savage.net.au/SQL/
Если найдешь, что в SQL92 это есть, напиши ссылку.

Flack_bfsp

Я читал стандарт, в отличии от тебя.
Тебя носом ткнуть или сам таки найдёшь?

Flack_bfsp

Кстати, в той ссылке, которую ты мне дал, ошибка.
Там написано, что
<null predicate> ::= IS [ NOT ] NULL

а на самом деле в стандарте
<null predicate> ::= <row value constructor> IS [ NOT ] NULL

Надеюсь, не надо объяснять, что в твоей ссылке действительно ошибка?

Dasar

по этому не заметно, что в order by возможны выражения
<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

Helga87

Скажи, пожалуйста, зачем вообще этот спор? Какая разница что написано в стандарте, если известно, что не все поддерживают это? Вместо этого, в данном случае, рулит простая проверка на каких субд работает, на каких нет.

Dasar

> Я читал стандарт, в отличии от тебя.
> Тебя носом ткнуть или сам таки найдёшь?
покажи, плиз, причем определение семантики конструкции order by, а не только ее синтаксиса.

Flack_bfsp

Ты что, Ваня! Это же спор ради спора!
А по теме - да, насчёт IS NULL внутри ORDER BY я погорячился.
Он только внутри WHERE может быть.
Но всё равно не беда - UNION от WHERE col IS NOT NULL и WHERE col IS NULL решает поставленную задачу.

timefim

Скажи, пожалуйста, зачем вообще этот спор?
Ща выяснится у кого длиннее познание в стандартах, и все будет тип-топ.

timefim

Но всё равно не беда - UNION от WHERE col IS NOT NULL и WHERE col IS NULL решает поставленную задачу.
Это еще в третьем посте было предложено.

Dasar

> Какая разница что написано в стандарте, если известно, что не все поддерживают это? Вместо этого, в данном случае, рулит простая проверка на каких субд работает, на каких нет
Обращение к стандарту - служит для решения одной из стандартных проблем, а именно для решения "комбинаторного взврыва".
в данном случае, к такому "взрыву" приводят: кол-во фич * кол-во реализаций.
при обращений к стандарту кол-во вариантов сокращается:
кол-во фич * кол-во стандартов + кол-во стандартов * кол-во реализаций.

Flack_bfsp

Да, да! После долгих поисков мы снова пришли к единственно верному переносимому решению! Ура!

Helga87

Тут скорее ответ на вопрос "зачем нужны стандарты", а не на вопрос "почему пофиг, что написано в стандарте, если данная фича реализована заведомо по-разному".
кол-во фич * кол-во стандартов + кол-во стандартов * кол-во реализаций.

Странная немного формула, надо признать. Потому что оказывается, что лучше всего жить, если кол-во стандартов = 0. Хотя идея понятна

Dasar

> Потому что оказывается, что лучше всего жить, если кол-во стандартов = 0.
да, да, надо еще расмотреть дробные и комплексные кол-ва стандартов.
а если серьезно, то нулевое кол-во стандартов не решает вышепоставленной задачи: фичу стоит юзать или нет.

Dasar

> а не на вопрос "почему пофиг, что написано в стандарте, если данная фича реализована заведомо по-разному".
если в качестве стандарта понимать - "входит в спецификацию и реализовано на большинстве реализаций", то такой вопрос не стоит.
именно такое определение стандарта обычно используется на практике.

6yrop

Но всё равно не беда - 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
Оставить комментарий
Имя или ник:
Комментарий: