Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Направление сортировки  [new]
Exteris
Member

Откуда: Новосибирск
Сообщений: 983
Можно как-то сделать направление сортировки в зависимости от параметра?
Попробовал так -
Order by case when :DATA=1 then s.dataexpto asc when :DATA=2 then s.dataexpto desc end

Не проканало.

Всех с пятницей!
23 авг 19, 14:17    [21956482]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

На клиенте это будет удобнее.

Posted via ActualForum NNTP Server 1.5

23 авг 19, 14:19    [21956485]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Exteris
Member

Откуда: Новосибирск
Сообщений: 983
Да на клиенте легко. Подумал, мож есть какая фича(костыль), о которых не знаю.
23 авг 19, 14:21    [21956489]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6229
Exteris,

 sql='select .....';
 if (data=1) then sql=sql||'.... asc ';
 else sql=sql||'.... desc ';
 for execute statement :sql into .... do ....
23 авг 19, 14:26    [21956501]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Exteris
Member

Откуда: Новосибирск
Сообщений: 983
О, вот и костыль, спасибо.))
23 авг 19, 14:44    [21956528]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
court
Member

Откуда:
Сообщений: 1784
...
Order by 
    case when :DATA=1 then s.dataexpto end asc 
    ,case when :DATA=2 then s.dataexpto end desc 
23 авг 19, 15:06    [21956540]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Exteris,

order by 
        case 
            when :DATA=1 then DATEDIFF(day, s.dataexpto, date '01-01-1900') 
            when :DATA=2 then DATEDIFF(day, date '2100-01-01', s.dataexpto)
        end
23 авг 19, 15:22    [21956549]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Exteris,

домножай значение, приведённое к числу, на плюс единицу или минус единицу (параметр) и сортируй по результату :-)
23 авг 19, 17:32    [21956674]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
кстати, хорошо бы оптимизатор умел применять индексы по выражениям для order by column * :Param - ибо параметр тут для запроса константа
23 авг 19, 17:35    [21956675]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
Arioch,

я уже лет двадцать точно вижу обсуждения типа
"а почему бы не сделать в SQL что-то вроде
select :param1 from :param2 where :param3 order by :param4 :param5 ?"

А в :param писать списки, и т.д.
23 авг 19, 19:01    [21956705]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8347
Exteris
О, вот и костыль, спасибо.))
Там обрыв. Не, оно вестимо сработает, только будет доп коннект самого на себя, пойдут лесом депенденсы. Короче для сворачивания шеи вполне достаточно, идти туда можно если ну ОЧЕНЬ хочется.

Помножить на "-1 " зело проще.

Когда встречаю подобный фарш у себя устраиваю разбор полетов с переписыванием.
26 авг 19, 11:11    [21957527]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
kdv,

ну причёт тут списки?

функции y=x и y=-x - две очень узко определённых случая, которые к спискам никак не относятся.
26 авг 19, 13:49    [21957631]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
http://tracker.firebirdsql.org/browse/CORE-6131
26 авг 19, 19:06    [21957868]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Arioch,

продолжаем кормить трекер какой-то хренью (я вообще не понял что там написано)
дабы потом снова обиженно заявлять о том, как ленивые разработчики не любят
своих пользователей и как они там вообще зазвездились и не бросились делать
такую охренительную фичу
26 авг 19, 19:41    [21957881]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
Arioch,

жалко что в трекере нет опции "развидеть".

p.s. ё-моё, ну вы серьезно хотите ASC/DESC через параметр? ядреный стыд...
27 авг 19, 00:30    [21957994]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Exteris
Member

Откуда: Новосибирск
Сообщений: 983
Ivan_Pisarevsky
Exteris
О, вот и костыль, спасибо.))
Там обрыв. Не, оно вестимо сработает

У меня тип поля - дата. Так что вариант Влада подошел.
А вообще да, проще на клиенте. Но пока нет возможности его обновить.
27 авг 19, 06:59    [21958023]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
kdv,

чем это по сути отличается от ....WHERE ID = 1 через параметр?

а тем более, от ....WHERE ID = 1 OR 1 IS NULL через параметр?

кроме того, что одно Firebird уже умеет и все привыкли, а другое - ещё нет и все привыкли

-------

hvlad
я вообще не понял


печально

полноценную поддержку сортировки по подходящему индексу запросов типа select .... order by ? * (field1+field2), и как частный случай select .... order by ? * field1
27 авг 19, 11:49    [21958186]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
Arioch
полноценную поддержку сортировки по подходящему индексу запросов типа select .... order by ? * (field1+field2), и как частный случай select .... order by ? * field1


* - это что?
что такое order by ? (field1+field2) ?
что значит "полноценная поддержка сортировки"? order by не использует "подходящие индексы"? Что тогда такое "подходящие индексы"?
27 авг 19, 13:41    [21958288]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
это умножение, такая операция арифметическая

order by - это указание отсортировать результат выборки в стандарте SQL

(field1+field2) - это пример арифметического выражения, использующего поля таблицы ("field" по-английски "поле"). Причём, одной и той же таблицы оба поля, потому что не указаны ни алиасы таблиц ни их названия.

> order by не использует "подходящие индексы"?

когда как

select * from t2 order by id
PLAN (T2 ORDER PK_T2)

select * from t2 order by id desc
PLAN SORT ((T2 NATURAL))

select * from t2 order by cast (:direction as integer) * id -- параметр равен +1
PLAN SORT ((T2 NATURAL)) -- а лучше бы было PLAN (T2 ORDER PK_T2)
27 авг 19, 13:48    [21958297]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Кстати, ещё забавное в 2.5 (вероятно и 3, не пробовал) и IBE

select * from t2 order by id * :x
Data type unknown.

интересно, почему unknown, если id integer?
27 авг 19, 13:52    [21958299]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Arioch,

ну вот опять ты несешь чушь.

1. В Firebird индексы однонаправленные. Что ты хотел показать своим order by id desc? Непонимание методов доступа? Уж лучше пожелать двунаправленных индексов. Да это не так просто сделать, но наверное возможно и пользы будет больше.

2. order by cast (:direction as integer) * id ещё одна билиберда. Ещё раз почитай статью про методы доступа и как работает навигация по индексу. Что будет если в direction передать число такое что результат вылезет за диапазон id? В индексе этих данных нет. Как оно должно по индексу бежать?
27 авг 19, 13:56    [21958304]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Arioch
интересно, почему unknown, если id integer?


да неужели? А double не может быть?
27 авг 19, 13:59    [21958309]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Симонов Денис,

я знаю, и в тикете про однонаправленность написано. Показать я хотел - разное поведение, именно что индекс иногда применим, а иногда нет.

более того, я знаю, и что планы в текущей реализации строятся при prepare, когда значений параметров ещё нет, и что вариантных планов в FB нету. Именно поэтому тикет оформлен как improvement, а не bug

прочитай наконец тикет, он гораздо короче "методов доступа". Речь идёт про четкий случай, где id = +1 либо -1 либо 0

впрочем, твой случай "если в direction передать число такое что результат вылезет за диапазон" implementaiton details вполне можно свести к той же тройке вариантов

- брать signum(direction): исходно SQL - математическая абстракция, и конечного диапазона у чисел нет.

А реализации SQL должны стараться выдать математически-коррeктный результат и свободны в выборе внутренней реализации. Соотвественно, переполнение при умножении тут не имеет значения, потому что результат клиенту не отдается, он только внутренне используется для сортировки.

результат сортировок order by +0.0001 * id и order by +1 * id и order by +1000 * if совпадает, поскольку зависит только от знака

и оптимизатор, поэтому, сохраняя математически корректный результат сортировки, имеет право эти выражения менять одно на другое

и да, для любителей "заставить сортировать после натурала, несмотря на существующий индекс" останется order by id+0
27 авг 19, 14:08    [21958324]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Симонов Денис
Arioch
интересно, почему unknown, если id integer?


да неужели? А double не может быть?


а он в обоих случаях может, и в случае явного CAST тоже, почему бы нет?

впрочем, это уже будет третья ветка разговора, ну её к лешему
27 авг 19, 14:11    [21958330]     Ответить | Цитировать Сообщить модератору
 Re: Направление сортировки  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Arioch
случай, где id = +1 либо -1 либо 0


не id, а SQL-параметр конечно
27 авг 19, 14:14    [21958336]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить