powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Натуральная сортировка
25 сообщений из 30, страница 1 из 2
Натуральная сортировка
    #39619221
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! подскажите пожалуйста, мне в бд mssql нужно отсортировать данные типа varchar такого рода:
текст М10
текст М12
текст М14
текст М16
текст М5
текст М6
текст М8,
хотелось бы
текст М5
текст М6
текст М8
текст М10
текст М12
текст М14
текст М16.
Написала такой запрос:
Select Stand.Stand_ID,Stand.Mark,Stand.Type,Gost.Name, Stand.Prd, Stand.Symbol, Stand.Name as ProductName from Standart.dbo.Stand, Standart.dbo.Gost
where Gost.Gost_ID=Stand.Gost_ID and Stand.Name='Болт с шестигранной головкой'
ORDER BY CASE WHEN ISNUMERIC(Stand.Mark)<>0 THEN CAST(Stand.Mark AS INT)+0
ELSE 2147483648 END ASC, CASE WHEN Stand.Mark LIKE '%[0-9]%' THEN 1 ELSE 0 END ASC, Stand.Mark
но он не сортирует так, как хотелось бы.
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619229
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:
Код: sql
1.
2.
3.
4.
SELECT *
FROM   Standart.dbo.Stand
ORDER BY
       CAST(CASE WHEN ISNUMERIC(RIGHT(Mark, 2)) = 1 THEN RIGHT(Mark, 2) ELSE RIGHT(Mark, 1) END AS INT)
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619243
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

не сортирует
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619252
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina,

Код: sql
1.
2.
Order by left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )-1),
        isnull(try_cast(substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,patindex ('%[^0-9]%',substring(@name,patindex ('%м[0-9]%',Stand.Mark )+1,1000))) as int),0)
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619253
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )-1)

- выделяет часть наименования до "М00", по ней можно не сортировать
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619256
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,

try_cast не является известным имя встроенной функции.
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619263
Kopelly,

если у вас текст до чисел статичный, то можно сортировать по len(Stand.Mark), Stand.Mark
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619268
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кролик-зануда,
надо именно не по длине строки, а по числам. такой запрос немного не то даст
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619273
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina, тогда обычным cast'ом

Код: sql
1.
2.
Order by left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )-1),
        cast(substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,patindex ('%[^0-9]%',substring(@name,patindex ('%м[0-9]%',Stand.Mark )+1,1000))) as int)
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619274
TsYekaterina,

а вы проверяли, то или не то(с учетом заданных мной ограничений)?
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619277
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кролик-зануда,

да, проверяла
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619279
TsYekaterina,

а можно примерчик того, что отсортировалось не так?
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619280
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,

все нормалек! спасибо!
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619282
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На случай если не во всех строках есть "Мхх":

Код: sql
1.
2.
3.
4.
5.
Order by 
case patindex ('%м[0-9]%',Stand.Mark ) When 0 Then Stand.Mark else left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )-1) end ,
	   case patindex ('%м[0-9]%',Stand.Mark ) When 0 then 0 
       else cast(substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,case patindex ('%[^0-9]%',substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,1000)) When  0 Then 1000
	                                                           else patindex ('%[^0-9]%',substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,1000)) end) as int) end
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619286
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,

премного благодарна!
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619465
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 select * 
 from 
 (
    values ('текст М10'),
('текст М12'),
('текст М14'),
('текст М16'),
('текст М5'),
('текст М6'),
('текст М8')
 ) t1 (f1)
order by  REVERSE(cast(f1 as char(10)))
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39619477
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
order by 
    cast(right(f1, (patindex('%[^0-9]%', reverse(f1))) - 1) as int)
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627468
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в продолжение темы...
а если нужно отсортировать, например, десятичные дроби:
1х5
2х10
2х10.20Х13.Хим.Пас
2.2х20
2.3х16.019
2.3х8
2.6х16
2.8х20
2.10х36
3х16.20Х13.Хим.Пас
6х36.20Х13.Хим.Пас
причем, разделитель может быть не только буква "х", но и "-"
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627484
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina,

Вы хотите применить к нереляционным данным реляционные запросы. Превратите эту свалку к требованиям хотя бы первой нормальной формы, а потом сортируйте. Или сортируйте на стороне клиентского приложения.
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627563
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

я сортирую локально через sql запрос.
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627564
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterinaВладислав Колосов,

я сортирую локально через sql запрос.SQL запрос обрабатывается на сервере, а не локально
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627577
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос закрыт, разобралась...
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627598
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поведайте всем как решили

PS
в порядке бреда:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @t table(v varchar(50))

insert into @t (v)
values('1х5'),
('2х10.20Х13.Хим.Пас'),
('2х10'),
('2.2х20'),
('2.6х16'),
('2.8х20'),
('2.3х16.016'),
('2.3х16.009'),
('2.3х16.019'),
('2.3х8'),
('2.10х36'),
('3х16.20Х13.Хим.Пас'),
('6х36.20Х13.Хим.Пас')

select v 
from @t
order by replace(replace(replace(replace(replace(replace(replace(replace(replace(v, '1', 'a'),'2', 'b'), '3', 'c'),'4','d'),'5','e'),'6','f'),'7', 'g'),'8','h'),'9','i')
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627714
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

И куда отсортирует "10х5"?
...
Рейтинг: 0 / 0
Натуральная сортировка
    #39627739
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

SELECT Stand.*, Gost.Gost_ID AS GostID, Gost.Name AS GostName,
Okp.Okp_ID AS OkpID,Okp.Klass,Okp.Naim FROM Standart.dbo.Stand, Standart.dbo.Gost, Standart.dbo.Okp
WHERE Stand.Gost_Id=Gost.Gost_Id AND Stand.Okp_Id=Okp.Okp_Id and stand.Name='Штифт'
Order by left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+0),
cast(substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,patindex ('%[^0-9]%',substring(Mark,patindex ('%м[0-9]%',Stand.Mark )+2,1000))) as int), REPLACE(Stand.Mark, '.', 'ц')
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Натуральная сортировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]