Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Переменное правило сортировки. Возможно ли это?   Найти похожие ветки 

 
alex-ran   (2005-09-15 16:43) [0]

Уважаемые мастера. Возникла необходимость сортировать Набор Данных с переменным условием сортировки, допустим если первое поле нечетное (либо какое другое условие) - то второе поле по возрастанию, и первое четное -  второе по убыванию и т. д., Например:

 Есть:                             Надо получить:

№       Длина                 №       Длина
1        500                     1        500
1        1600                   1        1600
2        700                     2        1400
2        1400                   2        700
3        600                     3        200
3        200                     3        600

Можно ли такое сделать средствами SQL?
Пока что приходится делать руками.
С уважением, Александр.


 
ANB ©   (2005-09-15 17:09) [1]

Можно. Выделить калькулируемое поле в запросе, с помощью case его правильно заполнить и сортировать по нему.
Проблемы (имхо) :
1. Не все движки съедят эту конструкцию (Оракл съест точно)
2. Будет тормозить на больших выборках, так как индекс здесь не прикрутишь.


 
alex-ran   (2005-09-15 17:28) [2]

Блин, извиняюсь, забыл уточнить, а в Paradox ?


 
Reindeer Moss Eater ©   (2005-09-15 17:29) [3]

для Оракла:
...
order by №,decode(bitand(№,1),1,длина,0,1 - длина)


 
Reindeer Moss Eater ©   (2005-09-15 17:30) [4]

Для парадокса изучай LocalSQL Guide


 
Johnmen ©   (2005-09-15 17:35) [5]

Не поможет...


 
alex-ran   (2005-09-15 17:50) [6]

Вообще-то я и склонялся к мысли как и Johnmen ©
но думал, а вдруг?
Ну а раз нет, то спасибо всем и вопрос закрыт.


 
Reindeer Moss Eater ©   (2005-09-15 17:56) [7]

Кажется это можно и в LocalSQL.
:)


 
Reindeer Moss Eater ©   (2005-09-15 18:00) [8]

Нет, все таки нельзя.
В смысле я написал выражение, которое выстроит надор данных по этому правилу, но capability no supported


 
Reindeer Moss Eater ©   (2005-09-15 18:02) [9]

Нет все таки можно.
Напишу когда приду домой.


 
alex-ran   (2005-09-15 18:11) [10]

Если получится, просьба поделиться ноу-хау.
Будем-с ждать. :)


 
Reindeer Moss Eater ©   (2005-09-15 19:32) [11]

Если поле num целочисленное, то :

select num,((num - 2 * (num / 2)) - 0.5) * len, len from test
order by 1,2

Если дробное, то чуть сложнее.


 
Johnmen ©   (2005-09-15 20:23) [12]

>Reindeer Moss Eater ©  (15.09.05 19:32) [11]

Поправочка (для Paradox7)

SELECT F1,
 (CAST(0.5-(CAST(F1/2 AS INTEGER)-F1/2) AS INTEGER)-1)*F2,  
 F2
FROM Table
ORDER BY 1,2


 
Reindeer Moss Eater ©   (2005-09-15 20:28) [13]

Ну если поле целочисленное, то деление на два и так будет целочисленным.
И каст к интегеру не нужен.


 
Johnmen ©   (2005-09-15 21:25) [14]

>Ну если поле целочисленное, то деление на два и так будет целочисленным

Это как это ???

>И каст к интегеру не нужен.

По-моему ((num - 2 * (num / 2)) - 0.5) всегда = -0.5
Или нет ?


 
Reindeer Moss Eater ©   (2005-09-15 23:00) [15]

>Ну если поле целочисленное, то деление на два и так будет целочисленным

Это как это ???


Да так. Результат <целочисленное поле> / 2 будет целочисленным.


 
Fedia ©   (2005-09-15 23:12) [16]

Reindeer Moss Eater ©   (15.09.05 23:00) [15]
>Да так. Результат <целочисленное поле> / 2 будет целочисленным.
Ты не путаешь понятие "целочисленное" и "четное" ?


 
Reindeer Moss Eater ©   (2005-09-15 23:15) [17]

create table test(num integer)
insert into test values(1)
insert into test values(2)
insert into test values(3)
insert into test values(4)
insert into test values(5)

select num, num - (2 * (num / 2)) from test

Получаем:
1,1
2,0
3,1
4,0
5,1

Проверено электроникой.


 
Fedia ©   (2005-09-15 23:41) [18]

Предположил, что твой результат, это глюк, возникающий про работе с Paradox.  Проверил. Получается:
1,0
2,0
3,0
4,0
5,0
как и должно быть.


 
Reindeer Moss Eater ©   (2005-09-15 23:48) [19]

Федя, у тебя тип поля какой?


 
Fedia ©   (2005-09-16 00:10) [20]

Твоя правда. Просто странно это...
У меня было поле Number.


 
Johnmen ©   (2005-09-16 09:17) [21]

>Reindeer Moss Eater ©   (15.09.05 23:15) [17]
>Получаем:
>1,1
>2,0
>3,1
>4,0
>5,1
>Проверено электроникой.

Какой именно электроникой ? Подробно.


 
Reindeer Moss Eater ©   (2005-09-16 09:30) [22]

Продукт:
Delphi7

Приложение:
SQL explorer

База данных
DBDEMOS

Таблица:
employee.db

Запрос:
select empno - (2 * (empno / 2)) from employee

Выборка:

0
0
1
0
1
1
...


 
Johnmen ©   (2005-09-16 09:40) [23]

Всё понятно. Тип целочисленный.
И всё приводится к нему, дробная отбрасывается...



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.046 c
2-1128501065
Дилетант
2005-10-05 12:31
2005.10.30
Поиск по вхождению


8-1112943093
vidiv
2005-04-08 10:51
2005.10.30
Драйвер виртуальной звуковой карты


3-1127359637
V-A-V
2005-09-22 07:27
2005.10.30
Пароль на MDB


3-1127207552
Starcom
2005-09-20 13:12
2005.10.30
Как мне подсчитать разницу в формате (Год, лет) с текущей датой?


4-1119593490
uny
2005-06-24 10:11
2005.10.30
Как выключить винчестер? программно.