Можно ли ухитриться сделать такую сортировку?

Компьютеры. программирование, бытовая техника

Модератор: Саша З.

Яков
Администратор
Администратор
Сообщения: 35058
Зарегистрирован(а): 17 ноя 2001, 02:00
Откуда: Израиль, Ришон леЦион
Контактная информация:

Можно ли ухитриться сделать такую сортировку?

Сообщение Яков » 05 июн 2007, 15:22

Сейчас возникла реальная проблема.

При выборке в в SQL в ORACLE (SELECT...) делается сортировка (ORDER BY...)
При этом есть поле, назовем его SORT_FIELD, среди значений которого есть "B", "M", "O" (английский алфавит).
Есть и другие значения, но они при сортировке роли не играют.

Задача. Так задать сортировку, чтобы все строки со значением "M" были позже всех строк со значением "B" и "O"
(взаимное расположение "B" и "O" роли не играет).
Вот такая проблема.

Я совсем не уверен, что она имеет решение. Но а вдруг у кого есть идея?

irishak
Ветеран мега-форума
Сообщения: 14472
Зарегистрирован(а): 15 июн 2005, 13:53

Сообщение irishak » 05 июн 2007, 15:42

ну так на вскидку... создайте дополнительную таблицу из двух полей... В одном поле эти ваши буквы, в другой индекс по которому хотите их сортировать...
Сделайте джойнт полей с буквами в основной и вспомогательной таблице, а сортируйте по индексу из вспомогательной...
Спрашивайте в магазинах города – новый «Чупа-Чупс» на эбонитовой палочке. Соси – и вырабатывай электричество, так необходимое твоему государству!

AlexZ75
Участник со стажем
Сообщения: 1304
Зарегистрирован(а): 18 ноя 2001, 02:00
Откуда: Петах-Тиква
Контактная информация:

Сообщение AlexZ75 » 05 июн 2007, 19:39

Яков,
Проще, добавьте сортируемое поле:
select a.* from table a
order by decode(SORT_FIELD, 'M', 100000, ascii(sort_field))
Вроде так получается
:D
Отличительная черта большинства туземцев - человеколюбие.

Юрий
Ветеран мега-форума
Сообщения: 6549
Зарегистрирован(а): 19 ноя 2001, 02:00
Откуда: Рамла

Сообщение Юрий » 05 июн 2007, 20:07

У меня подобные задачи часто возникают и в MYSQL это достигается простейшей сортировкой ORDER BY SORT_FIELD='M' в этом случае все поля с M уйдут в конец выборки,если я правильно понял задачу

AlexZ75
Участник со стажем
Сообщения: 1304
Зарегистрирован(а): 18 ноя 2001, 02:00
Откуда: Петах-Тиква
Контактная информация:

Сообщение AlexZ75 » 05 июн 2007, 20:37

Юрий,
Это по сути тоже самое, decode вернет 100000 для 'M' и аски код для всего остального. :ic1:
Ваше вернет true/false (в оракле вроде нет буленов в SQL).
Отличительная черта большинства туземцев - человеколюбие.

Юрий
Ветеран мега-форума
Сообщения: 6549
Зарегистрирован(а): 19 ноя 2001, 02:00
Откуда: Рамла

Сообщение Юрий » 05 июн 2007, 20:42

AlexZ75,
в оракле вроде нет буленов в SQL

Я не спец по Ораклу,но вот таким простым способом с мелкими вариациями решал проблему не раз

Яков
Администратор
Администратор
Сообщения: 35058
Зарегистрирован(а): 17 ноя 2001, 02:00
Откуда: Израиль, Ришон леЦион
Контактная информация:

Сообщение Яков » 05 июн 2007, 21:34

Я понял. Спасибо.
Про DECODE я думал.
Проблема чуть сложнее.
Значенте поля не эти буквы, а начинаются с этих букв.
А LIKE вроде к DECODE никаким боком
Как быть в этом случае?

Юрий
Ветеран мега-форума
Сообщения: 6549
Зарегистрирован(а): 19 ноя 2001, 02:00
Откуда: Рамла

Сообщение Юрий » 05 июн 2007, 21:39

Значенте поля не эти буквы, а начинаются с этих букв.

Пример для MYSQL

Код: Выделить всё

ORDER by SUBSTRING(SORT_FIELD,1,1)='M'

Видимо подобное может быть для DECODE

AlexZ75
Участник со стажем
Сообщения: 1304
Зарегистрирован(а): 18 ноя 2001, 02:00
Откуда: Петах-Тиква
Контактная информация:

Сообщение AlexZ75 » 06 июн 2007, 06:15

Яков, ну что вы право...

Юрий,
100% в оракл будет такой вариант
order by decode(SUBSTRING(SORT_FIELD,1,1), 'M', 100000, ascii(sort_field))

В конце концов можно написать свою функцию которая вернет вес слова, либо поменяет буквы:
Скажем в это случае можно:
Order by replace(sort_field,'M', chr(ascii('Z')+1)))
Тогда сортировка будет совсем правильная, а не только по первым буквам.

Со своей функцией:
order by my_function(sort_field)

Если таблицы большие, стоит подумать о функциональных индексах :D
Отличительная черта большинства туземцев - человеколюбие.

Яков
Администратор
Администратор
Сообщения: 35058
Зарегистрирован(а): 17 ноя 2001, 02:00
Откуда: Израиль, Ришон леЦион
Контактная информация:

Сообщение Яков » 06 июн 2007, 06:57

AlexZ75, Юрий,

Спасибо.
Свою функцию или индексы мне не разрешат поставить, но остальное сегодня попробую.


Вернуться в «Наука и техника»




  Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 33 гостя