Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
Есть ли стандартный способ отсортировать таблицу так чтобы в записи string определялось число и сортировалось согласно этому? (StrCmpLogicalW)
Чтобы список был отсортирован так:
автор
2string
3string
20string
st2ring
st3ring
st20ring
string2
string3
string20

а не так:
автор
20string
2string
3string
st20ring
st2ring
st3ring
string2
string20
string3

Если стандартного способа нет, то как можно решить задачу?
17 дек 15, 08:51    [18571244]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20960
Функциями поделить строку на части и сортировать по ним.
17 дек 15, 09:02    [18571270]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
С трудом представляю как это сделать... не сочтите за наглость... приведите пример решения.
17 дек 15, 09:15    [18571312]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
Есть ли стандартный способ отсортировать таблицу так чтобы в записи string определялось число и сортировалось согласно этому?

Что такое "стандартный способ" ? Уже готовый/встроенный ?
17 дек 15, 09:17    [18571317]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
С трудом представляю как это сделать... не сочтите за наглость... приведите пример решения.

найти в строке подстроку из подряд идущих цифр
17 дек 15, 09:17    [18571321]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
Glory
Ashoorup
Есть ли стандартный способ отсортировать таблицу так чтобы в записи string определялось число и сортировалось согласно этому?

Что такое "стандартный способ" ? Уже готовый/встроенный ?

Да.
17 дек 15, 10:25    [18571544]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
Glory
пропущено...

Что такое "стандартный способ" ? Уже готовый/встроенный ?

Да.

Такого способа нет
17 дек 15, 10:26    [18571553]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
Ashoorup,

поищите поиском темы "цифры из строки"
17 дек 15, 10:27    [18571562]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
Glory
Ashoorup
С трудом представляю как это сделать... не сочтите за наглость... приведите пример решения.

найти в строке подстроку из подряд идущих цифр

если бы все так просто...
а вот такие строки:
автор
2Str 4ght
2Str 5ght
20Str 4ght
2Str 11ght
#7Str 5g!h t

и т.д.
Строки где есть пробелы, различные символы, несколько раз встречающиеся цифры и т.д.
В общем нужна сортировка как в проводнике Windows, начиная с XP (до этого сортировка была без логики функции StrCmpLogicalW function). Кстати говоря в Windows XP и выше такая сортировка отключается.
17 дек 15, 10:40    [18571655]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
если бы все так просто...
а вот такие строки:
автор
2Str 4ght
2Str 5ght
20Str 4ght
2Str 11ght
#7Str 5g!h t

и т.д.
Строки где есть пробелы, различные символы, несколько раз встречающиеся цифры и т.д.

Вы хотите, чтобы за вас кто-то решил, какая именно подстрока должна быть использована для преобразования в число ?

Ashoorup
В общем нужна сортировка как в проводнике Windows, начиная с XP (до этого сортировка была без логики функции StrCmpLogicalW function). Кстати говоря в Windows XP и выше такая сортировка отключается.

Ну так что вам мешает реализовать такую функцию на TSQL ?
17 дек 15, 10:42    [18571677]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Glory
Ну так что вам мешает реализовать такую функцию на TSQL ?
Всё это многократно здесь было.
Даже придумывать самому необязательно. Достаточно поискать.
17 дек 15, 10:46    [18571709]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
Glory
Вы хотите, чтобы за вас кто-то решил, какая именно подстрока должна быть использована для преобразования в число ?
Ну так что вам мешает реализовать такую функцию на TSQL ?


Glory, еслиб я так хорошо владел TSQL, думаю топик бы не создавал. Не поймите меня неправильно, я не с наглой точки зрения прошу, потому что мне лень. Если это решается просто на TSQL что-то типа:
ORDER BY CAST(STUFF(Field,1,NULLIF(PATINDEX('%[0-9]%',Field),0)-1,'')AS INT)
, то прошу помочь в решении задачи, т.к. не владею языком. Если это сложный алгоритм, который требует много времени, то так и напишите и пойду я в сад со своей проблемой.

Спасибо за понимание
17 дек 15, 10:59    [18571791]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
Glory, еслиб я так хорошо владел TSQL, думаю топик бы не создавал.

до SQL вообще то нужно задать критерии преобразования, т.е. ваш алгортим сортировки

Ashoorup
Если это решается просто на TSQL что-то типа:

Что "это" ? Функция StrCmpLogicalW ?
17 дек 15, 11:02    [18571808]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Ashoorup
Glory
Вы хотите, чтобы за вас кто-то решил, какая именно подстрока должна быть использована для преобразования в число ?
Ну так что вам мешает реализовать такую функцию на TSQL ?


Glory, еслиб я так хорошо владел TSQL, думаю топик бы не создавал. Не поймите меня неправильно, я не с наглой точки зрения прошу, потому что мне лень. Если это решается просто на TSQL что-то типа:
ORDER BY CAST(STUFF(Field,1,NULLIF(PATINDEX('%[0-9]%',Field),0)-1,'')AS INT)

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

Спасибо за понимание
Прежде чем ждать готового решения, хотя бы формализуйте возможную структуру строки с цифрами.
Что там может быть? Сколько непрерывных последовательностей цифр?
Если несколько, то как их учитывать при сортировке? И т.д.
17 дек 15, 11:06    [18571831]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
Glory
Что "это" ? Функция StrCmpLogicalW?

Эта функция просто сравнивает две строки по той логике что мне нужно. Хотелось бы подсунуть таблицу и сортировать ее по алгоритму сравнения StrCmpLogicalW.
17 дек 15, 11:08    [18571843]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
Эта функция просто сравнивает две строки по той логике что мне нужно. Хотелось бы подсунуть таблицу и сортировать ее по алгоритму сравнения StrCmpLogicalW.

Ну так все просто - напишите эту функцию с ее алгоритмом.
17 дек 15, 11:10    [18571862]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
iap
Прежде чем ждать готового решения, хотя бы формализуйте возможную структуру строки с цифрами.
Что там может быть? Сколько непрерывных последовательностей цифр?
Если несколько, то как их учитывать при сортировке? И т.д.

Да все те же правила, что и с обычными именами папок. В строке могут встречаться любые (почти) символы и в любом количестве в любой позиции.
Правила сравнения: регистр не учитывается. Пробел идет выше цифр. Тире ниже цифр. Все печатаемые символы идут выше цифр (/ \ _ , . ; : ? @ $ ! и т.д.) идут выше цифр. Любые буквы идут ниже цифр. Цифры сравниваются как int, а не string (varchar)
17 дек 15, 11:24    [18571966]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Ashoorup
iap
Прежде чем ждать готового решения, хотя бы формализуйте возможную структуру строки с цифрами.
Что там может быть? Сколько непрерывных последовательностей цифр?
Если несколько, то как их учитывать при сортировке? И т.д.

Да все те же правила, что и с обычными именами папок. В строке могут встречаться любые (почти) символы и в любом количестве в любой позиции.
Правила сравнения: регистр не учитывается. Пробел идет выше цифр. Тире ниже цифр. Все печатаемые символы идут выше цифр (/ \ _ , . ; : ? @ $ ! и т.д.) идут выше цифр. Любые буквы идут ниже цифр. Цифры сравниваются как int, а не string (varchar)
Я спрашиваю: если в строке несколько чисел, разделённых нецифрами,
то как определять порядок?
Преобразовывать все числа в INTы? Или сначала вытащить цифры, объединить в одно число, а потом сравнивать?
Или ещё как-то?
17 дек 15, 11:29    [18572010]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Ashoorup, вот такая штука получилась:

select str_
from (values('2string'), ('3string'), ('20string'), ('st2ring'), ('st3ring'), 
            ('st20ring'), ('string2'), ('string3'), ('string20'), ('222'), ('')) as t (str_)
order by case when patindex('%[^0-9]%', str_) != 1 then 0 else 1 end
       , cast(substring(str_, 1, isnull(nullif(patindex('%[^0-9]%', str_)-1, -1), len(str_))) as int)
       , str_
17 дек 15, 11:29    [18572015]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Ashoorup, ах жеж, у вас и внутри строки числа должны сортироваться... Тогда не подходит этот вариант - он только по начальным цифрам сортирует.
17 дек 15, 11:32    [18572029]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Вот тут есть функция с натуральной сортировкой для MS SQL - мопед не мой, работоспособность алгоритма не проверял, поэтому смотрите сами, подойдет он вам или нет:

http://stackoverflow.com/a/5583068/1638615
17 дек 15, 11:38    [18572076]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
Minamoto , спасибо! похоже на то что нужно. Буду разбираться дальше сам.
17 дек 15, 11:45    [18572135]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Ashoorup
Member

Откуда: Минск
Сообщений: 111
iap
Преобразовывать все числа в INTы? Или сначала вытащить цифры, объединить в одно число, а потом сравнивать?
Или ещё как-то?

Все числа в int. Но не объединять их.
Например сравниваем
"6str r45gh yu" и
"6str r4pgh yu"
ключевым будет сравнение 45 и 4. Число 4 < 45 => меняем местами
17 дек 15, 11:49    [18572173]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Ashoorup, сразу замечание - если собираетесь это использовать на больших объемах на регулярной основе - лучше создайте отдельное поле, которое будет заполняться данными, которые можно отсортировать напрямую (строкой, получаемой в результате применения функции).
Использовать такую функцию для регулярной сортировки не рекомендуется - может существенно сказаться на производительности.
17 дек 15, 11:51    [18572184]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ashoorup
Все числа в int. Но не объединять их.
Например сравниваем
"6str r45gh yu" и
"6str r4pgh yu"
ключевым будет сравнение 45 и 4. Число 4 < 45 => меняем местами

Ну так и разбивайте свою строку на фрагменты - или полностью буквенные или полностью цифровые
И сравнивайте буквенные с буквенными,а цифровые с цифровыми
17 дек 15, 12:06    [18572288]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить