упорядочение по номеру в конце строки - PullRequest
1 голос
/ 11 августа 2011

У меня есть таблица с такими именами, как «работник 1», «работник 2», «работник 3» и т. Д. И, наконец, «работник 10», «работник 11», «работник 12».

Когда я получаю доступ ко всем именам, это происходит как сотрудник 1, работник 10, работник 11, работник 12, работник 2, работник 3 и т. Д.

Даже если я использую «заказ по идентификатору» или «заказ»по имени ", работник 10 идет первым, затем работник 1, работник 2 и сын и, наконец, работник 11, работник 12.

Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 11 августа 2011

Обратите внимание, что сортировка выполняется с использованием в алфавитном порядке ASCIIable сортировка.Сортировка не распознает наличие цифр после слова «работник», вместо этого каждая цифра обрабатывается как отдельный символ.

Порядок, который я ожидал бы, равен

Employee 1
Employee 10 
Employee 2
...
Employee 9 

, поскольку порядок определяется как

  1. Если символьный_n в строке A предшествует символьный_n в строке B, то строкаA предшествует строке B или наоборот.Если символы равны, тогда продолжить
  2. Если достигнут конец строки A, а в строке B больше букв, то строка A идет перед строкой B или наоборот.В противном случае перейдите к шагу 1.

Например:

  • Сотрудник 1 короче Сотрудника 10, но при этом равен до конца строки.
  • Сотрудник 10 стоит перед сотрудником 2, потому что 1 идет перед 2 в алфавитном порядке.
1 голос
/ 02 ноября 2015

Если строка перед числом всегда имеет одинаковую длину (например, она всегда «сотрудник»), вы можете использовать что-то вроде следующего:

SELECT * FROM employees ORDER BY ABS(SUBSTR(employeeName, 9)) ASC
1 голос
/ 11 августа 2011

Как уже сказал Алекси Ирттиахо, совершенно нормально, что Сотрудник 10 стоит перед Сотрудником 2. Если вы хотите отсортировать строки, вы должны признать, что есть установленные правила, и он не может делать то, что вы хотите, просто потому, что вам это нравится работать таким образом.

Если вы хотите заказать сотрудника от самого старого до самого последнего, вам нужно создать еще один столбец. Я бы предложил дату (дату, когда сотрудник присоединился к компании). Можно предложить инкрементный идентификатор, но я не думаю, что это лучшее решение. Однажды вы можете решить, что вы являетесь сотрудником, и добавить в таблицу строку, содержащую вашу информацию, и вы не сможете правильно ее отсортировать.

0 голосов
/ 02 июля 2012
   SELECT g.groupid,
          g.groupname,
          SUBSTRING(g.groupname, 1, PATINDEX('%[0-9]%', g.groupname + '0') - 1) grouptext, 
CASE WHEN ISNUMERIC(SUBSTRING(g.groupname, PATINDEX('%[0-9]%', g.groupname + '0'), 100) + '.0e0') IS NOT NULL 
     THEN SUBSTRING(g.groupname, PATINDEX('%[0-9]%', g.groupname + '0'), 100) 
     ELSE 0 END groupnum
     FROM Groups g
 ORDER BY grouptext, groupnum;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...