как правильно выполнить max () для буквенно-цифрового столбца

#sql-server-2005 #tsql

#sql-server-2005 #tsql

Вопрос:

У меня есть таблица для пользователей, где идентификаторы такие: ASmith1, Asmith2, Asmith3, Asmith5, Asmith9, Asmith10, Asmith13, Asmith15, Asmith21 и т.д.

Когда я получаю Max () для этого столбца, я получаю Asmith9. Какой запрос или функцию я могу использовать, чтобы получить Asmith21?

Ответ №1:

    declare @Users table(ID varchar(10));
    insert into @Users
        select  'ASmith1' union all 
        select  'Asmith2' union all 
        select  'Asmith3' union all 
        select  'Asmith5' union all 
        select  'Asmith9' union all 
        select  'Asmith10' union all 
        select  'Asmith13' union all 
        select  'Asmith15' union all 
        select  'Asmith21'

    select  top 1 ID
    from    @Users
    order
    by      len(ID) desc, ID desc;
  

Ответ №2:

Если у вас есть контроль над именами, вы можете добавлять к ним числа, используя достаточное количество начальных нулей для ваших нужд. В противном случае вам нужно будет отделить числовую часть от альфа-части и отсортировать соответствующим образом.

В SQL Server нет готового регулярного выражения, но вы можете создать для него функцию, как показано в этой статье, которая использует преимущества доступа SQL Server к .Net:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

Ответ №3:

Нет возможных решений напрямую, однако вы можете хранить строки фиксированной длины, тогда возможно, например:

 Asmith001, Ashmith002, Ashmit021, Ashmit100
  

Другой метод заключается в использовании строковых функций для достижения подобного результата в запросе, а затем вы можете заказать.

Комментарии:

1. или лучше сохранить в виде двух полей — символы, а затем целое число