Mar 21, 2010 18:38
Недавно ко мне вновь обратился бывший коллега с вопросом по MySQL. Так уж получилось, что у меня шило в заднице мне везде нужно покопаться и поковыряться, раздраконить и понять.
Ну так вот. Задачка у человека: провести сортировку по полю согласно здравому смыслу правил математики, содержащему текстовые записи вида: op1, op2, op100, op200, op300. Понятно, что простая сортировка выдаст такое:
mysql> SELECT * FROM t ORDER BY r1;
+-------+--------+
| r1 | r2 |
+-------+--------+
| op1 | 123123 |
| op100 | 123123 |
| op2 | 123123 |
| op200 | 123123 |
| op300 | 123123 |
+-------+--------+
5 rows in set (0.00 sec)
Через минуту раздумий придумал костыль решение родилось. Не самое правильное и не самое изящное, но, блин, работающее через пень-колоду. Ввиду того, что формат в данном случае достаточно строгий (всегда строка начинается с ^op), можно использовать функции для работы со строками, а также приведение типов:
mysql> SELECT * FROM t ORDER BY CAST( SUBSTRING(r1,3,LENGTH(r1)) AS decimal);
+-------+--------+
| r1 | r2 |
+-------+--------+
| op1 | 123123 |
| op2 | 123123 |
| op100 | 123123 |
| op200 | 123123 |
| op300 | 123123 |
+-------+--------+
5 rows in set (0.00 sec)
Думаю, что такая хреновина будет успешно использоваться товарищем. Но меня коробит то, что решение "заточено" под конкретную ситуацию (все равно, что для "жигулей" свой бензин выпускать, единственно подходящего состава, о квадратных колесах молчу). Если букв будет тупо не две, а три, и уж тем более, если они будут другими, запрос надо уже править. Глупо на самом деле.
Беглое изучение документации mysql и насилование гугла родило во мне подозрения, что без еще больших костылей в виде написания своей функции не обойтись. Оракловский транслейт здесь был бы очень кстати. Я видел примеры такой функции у одного чувака для mysql, но все же интересно, можно ли без этого. Оставил проблему на заметке.
компьютерные штучки,
приведение типа,
mysql,
сортировка