Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Есть ли стандартный способ отсортировать таблицу так чтобы в записи string определялось число и сортировалось согласно этому? (StrCmpLogicalW) Чтобы список был отсортирован так:
а не так:
Если стандартного способа нет, то как можно решить задачу? |
||||
17 дек 15, 08:51 [18571244] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Функциями поделить строку на части и сортировать по ним. |
17 дек 15, 09:02 [18571270] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
С трудом представляю как это сделать... не сочтите за наглость... приведите пример решения. |
17 дек 15, 09:15 [18571312] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что такое "стандартный способ" ? Уже готовый/встроенный ? |
||
17 дек 15, 09:17 [18571317] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
найти в строке подстроку из подряд идущих цифр |
||
17 дек 15, 09:17 [18571321] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Да. |
||||
17 дек 15, 10:25 [18571544] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Такого способа нет |
||||
17 дек 15, 10:26 [18571553] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2396 |
Ashoorup, поищите поиском темы "цифры из строки" |
17 дек 15, 10:27 [18571562] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
если бы все так просто... а вот такие строки:
и т.д. Строки где есть пробелы, различные символы, несколько раз встречающиеся цифры и т.д. В общем нужна сортировка как в проводнике Windows, начиная с XP (до этого сортировка была без логики функции StrCmpLogicalW function). Кстати говоря в Windows XP и выше такая сортировка отключается. |
||||||
17 дек 15, 10:40 [18571655] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы хотите, чтобы за вас кто-то решил, какая именно подстрока должна быть использована для преобразования в число ?
Ну так что вам мешает реализовать такую функцию на TSQL ? |
||||||
17 дек 15, 10:42 [18571677] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Даже придумывать самому необязательно. Достаточно поискать. |
||
17 дек 15, 10:46 [18571709] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Glory, еслиб я так хорошо владел TSQL, думаю топик бы не создавал. Не поймите меня неправильно, я не с наглой точки зрения прошу, потому что мне лень. Если это решается просто на TSQL что-то типа: ORDER BY CAST(STUFF(Field,1,NULLIF(PATINDEX('%[0-9]%',Field),0)-1,'')AS INT), то прошу помочь в решении задачи, т.к. не владею языком. Если это сложный алгоритм, который требует много времени, то так и напишите и пойду я в сад со своей проблемой. Спасибо за понимание |
||
17 дек 15, 10:59 [18571791] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
до SQL вообще то нужно задать критерии преобразования, т.е. ваш алгортим сортировки
Что "это" ? Функция StrCmpLogicalW ? |
||||
17 дек 15, 11:02 [18571808] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Что там может быть? Сколько непрерывных последовательностей цифр? Если несколько, то как их учитывать при сортировке? И т.д. |
||||
17 дек 15, 11:06 [18571831] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Эта функция просто сравнивает две строки по той логике что мне нужно. Хотелось бы подсунуть таблицу и сортировать ее по алгоритму сравнения StrCmpLogicalW. |
||
17 дек 15, 11:08 [18571843] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так все просто - напишите эту функцию с ее алгоритмом. |
||
17 дек 15, 11:10 [18571862] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Да все те же правила, что и с обычными именами папок. В строке могут встречаться любые (почти) символы и в любом количестве в любой позиции. Правила сравнения: регистр не учитывается. Пробел идет выше цифр. Тире ниже цифр. Все печатаемые символы идут выше цифр (/ \ _ , . ; : ? @ $ ! и т.д.) идут выше цифр. Любые буквы идут ниже цифр. Цифры сравниваются как int, а не string (varchar) |
||
17 дек 15, 11:24 [18571966] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
то как определять порядок? Преобразовывать все числа в INTы? Или сначала вытащить цифры, объединить в одно число, а потом сравнивать? Или ещё как-то? |
||||
17 дек 15, 11:29 [18572010] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
Ashoorup, ах жеж, у вас и внутри строки числа должны сортироваться... Тогда не подходит этот вариант - он только по начальным цифрам сортирует. |
17 дек 15, 11:32 [18572029] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
Вот тут есть функция с натуральной сортировкой для MS SQL - мопед не мой, работоспособность алгоритма не проверял, поэтому смотрите сами, подойдет он вам или нет: http://stackoverflow.com/a/5583068/1638615 |
17 дек 15, 11:38 [18572076] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Minamoto , спасибо! похоже на то что нужно. Буду разбираться дальше сам. |
17 дек 15, 11:45 [18572135] Ответить | Цитировать Сообщить модератору |
Ashoorup Member Откуда: Минск Сообщений: 111 |
Все числа в int. Но не объединять их. Например сравниваем "6str r45gh yu" и "6str r4pgh yu" ключевым будет сравнение 45 и 4. Число 4 < 45 => меняем местами |
||
17 дек 15, 11:49 [18572173] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
Ashoorup, сразу замечание - если собираетесь это использовать на больших объемах на регулярной основе - лучше создайте отдельное поле, которое будет заполняться данными, которые можно отсортировать напрямую (строкой, получаемой в результате применения функции). Использовать такую функцию для регулярной сортировки не рекомендуется - может существенно сказаться на производительности. |
17 дек 15, 11:51 [18572184] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так и разбивайте свою строку на фрагменты - или полностью буквенные или полностью цифровые И сравнивайте буквенные с буквенными,а цифровые с цифровыми |
||
17 дек 15, 12:06 [18572288] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |