#mysql
#mysql
Вопрос:
У меня есть столбец в базе данных MySQL с именем title
, который имеет тип данных varchar (255). При сортировке по title ASC
строки сортируются в этом порядке:
Example - A1 Some description
Example - A2 A different description
Example - A20 Some other wordin&
Example - A21 Different text
Example - A3 Some text
Example - A4 Some final text
Example item that does not follow pattern
В то время как мне нужно, чтобы он был отсортирован следующим образом:
Example - A1 Some description
Example - A2 A different description
Example - A3 Some text
Example - A4 Some final text
Example - A20 Some other wordin&
Example - A21 Different text
Example item that does not follow pattern
Я пытался использовать этот запрос:
SELECT *,
CAST(title AS UNSIGNED) casted_title
FROM example_table
ORDER BY casted_title,
title
Но это не помогло, так как casted_title
все строки возвращаются пустыми.
Я также пробовал этот запрос:
SELECT *,
BIN(title) AS bintitle
FROM cycle_tracker_event_cate&ories
ORDER BY bintitle,
title
Это тоже не помогло. Все строки возвращают bintitle
значение 0.
Есть ли способ выполнить сортировку желаемым образом, учитывая, что рассматриваемые числа относятся к середине предложения и могут быть рядом с буквой, а могут и не быть?
Редактировать:
Не все элементы в списке следуют одному и тому же шаблону, начинающемуся с «Example — «. Некоторые из них вообще не содержат никаких чисел, я просто сосредоточился на приведенных выше, потому что именно с ними у меня возникли проблемы.
Комментарии:
1. Всегда ли существует
-
, за которым следует пробел, за которым следует символ типаA
, а затем число? Если да, то хотите ли вы, чтобы строки сортировались только по этому номеру и ни по чему другому?2. Некоторые строки вообще не имеют номера. Извините, я должен был упомянуть это в своем вопросе. Сейчас я его обновлю. Спасибо.
3. Преобразование строки в число всегда возвращает результат
0
, если оно не начинается с числа. Он не будет искать номер в середине.4. Если в нем есть номер, всегда ли он после
Example - A
?5. Есть ли какой-нибудь способ добавить в таблицу новый столбец с номером, по которому вы хотите упорядочить? Даже если вы сможете сделать это таким образом, это будет очень неэффективно.
Ответ №1:
Вам нужно получить подстроку после Example - A
префикса, прежде чем преобразовывать ее в число, по которому вы можете упорядочивать. В противном случае он просто преобразуется в 0
.
ORDER BY IF(title LIKE 'Example - A%', 0 SUBSTR(title, LENGTH('Example - A')), 99999)
Комментарии:
1. К сожалению, это не сработало бы, поскольку не существует предсказуемого шаблона. Мои извинения, я думал, что ясно дал это понять в вопросе. Похоже, мой единственный вариант — следовать вашему комментарию и добавлять дополнительный столбец и сортировать по нему вместо этого. Спасибо.