Сравнение строк, представляющих собой целое число с буквой

Cyrax_02
Дата: 21.01.2013 21:17:21
Необходимо в запросе в условии WHERE сравнивать строки вида 8, 12,12а,12б, 125,128 и т.д.
Причём числовые их части должны сравниваться как числа, буквы - как символы. Т.е.:
8 < 12
8 < 12а
12 < 12а
12а < 12б
12а < 125
В составе строки могут быть только целые числа. Число символов-нецифр в конце может быть более 1 (12pr, 8tpr и т.п.)

Можно ли здесь обойтись без вычленения целых чисел и преобразования их в число ?
Как такое сравнение реализовать ? Не соображу. Желательно без регулярных выражений.
qwerty112
Дата: 21.01.2013 21:37:03
Cyrax_02
Необходимо в запросе в условии WHERE сравнивать строки вида 8, 12,12а,12б, 125,128 и т.д.
Причём числовые их части должны сравниваться как числа, буквы - как символы. Т.е.:
8 < 12
8 < 12а
12 < 12а
12а < 12б
12а < 125
В составе строки могут быть только целые числа. Число символов-нецифр в конце может быть более 1 (12pr, 8tpr и т.п.)

Можно ли здесь обойтись без вычленения целых чисел и преобразования их в число ?
Как такое сравнение реализовать ? Не соображу. Желательно без регулярных выражений.

select right(concat('0000000000', '12a'),10) < right(concat('0000000000', '12b'),10) 
Akina
Дата: 21.01.2013 21:50:43
mysql> create table test(a varchar(10), b varchar(10));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test (a,b) values ('8','12'), ('8','12a'), ('12','12a'), ('12a','12b'), ('12a','125');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select a,b,
    ->   case when cast(a as signed)=cast(b as signed)
    ->     then a<b
    ->     else cast(a as signed)<cast(b as signed)
    ->   end compare
    -> from test;
+------+------+---------+
| a    | b    | compare |
+------+------+---------+
| 8    | 12   |       1 |
| 8    | 12a  |       1 |
| 12   | 12a  |       1 |
| 12a  | 12b  |       1 |
| 12a  | 125  |       1 |
+------+------+---------+
5 rows in set, 7 warnings (0.00 sec)
Akina
Дата: 21.01.2013 21:55:18
qwerty112, LPAD() проще... и сбойнёт, если на хвосте, например, диез...
Cyrax_02
Дата: 21.01.2013 22:34:32
select right(concat('0000000000', '12a'),10) < right(concat('0000000000', '12b'),10) 

Этот вариант сработает только на строках с символьными частями одинаковой длины.

select right(concat('0000000000', '12с'),10) < right(concat('0000000000', '12br'),10)
даст неверный результат

То же касается и LPAD'а.
Akina
Дата: 21.01.2013 23:08:21
Cyrax_02
То же касается и LPAD'а.
Само собой, LPAD - это просто более понятная и короткая (имхо, конечно) версия right(concat()) ...
Cyrax_02
Дата: 21.01.2013 23:37:13
Akina, переделайте ваш запрос так, чтобы каждое из сравниваемых строк встречалось в нём только один раз.
tanglir
Дата: 22.01.2013 05:48:49
Cyrax_02
Akina, переделайте ваш запрос так, чтобы каждое из сравниваемых строк встречалось в нём только один раз.
Akina, это ваш препод, что ли?
Akina
Дата: 22.01.2013 15:27:38
Cyrax_02
переделайте ваш запрос так
Не, нормально так... я что, кому-то задолжать успел?
Akina
Дата: 22.01.2013 15:28:15
tanglir, нет, преподавательской деятельностью не занимаюсь.