Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Натуральная сортировка / 25 сообщений из 30, страница 1 из 2
23.03.2018, 08:07
    #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
23.03.2018, 08:30
    #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
23.03.2018, 08:45
    #39619243
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
skyANA,

не сортирует
...
Рейтинг: 0 / 0
23.03.2018, 08:59
    #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
23.03.2018, 09:01
    #39619253
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
Код: sql
1.
left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )-1)

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

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

если у вас текст до чисел статичный, то можно сортировать по len(Stand.Mark), Stand.Mark
...
Рейтинг: 0 / 0
23.03.2018, 09:19
    #39619268
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
кролик-зануда,
надо именно не по длине строки, а по числам. такой запрос немного не то даст
...
Рейтинг: 0 / 0
23.03.2018, 09:21
    #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
23.03.2018, 09:22
    #39619274
Натуральная сортировка
TsYekaterina,

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

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

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

все нормалек! спасибо!
...
Рейтинг: 0 / 0
23.03.2018, 09:30
    #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
23.03.2018, 09:39
    #39619286
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
Kopelly,

премного благодарна!
...
Рейтинг: 0 / 0
23.03.2018, 13:24
    #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
23.03.2018, 13:31
    #39619477
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
Код: sql
1.
2.
order by 
    cast(right(f1, (patindex('%[^0-9]%', reverse(f1))) - 1) as int)
...
Рейтинг: 0 / 0
09.04.2018, 12:25
    #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
09.04.2018, 12:57
    #39627484
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
TsYekaterina,

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

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

я сортирую локально через sql запрос.SQL запрос обрабатывается на сервере, а не локально
...
Рейтинг: 0 / 0
09.04.2018, 15:44
    #39627577
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
вопрос закрыт, разобралась...
...
Рейтинг: 0 / 0
09.04.2018, 16:15
    #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
10.04.2018, 04:56
    #39627714
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Натуральная сортировка
Konst_One,

И куда отсортирует "10х5"?
...
Рейтинг: 0 / 0
10.04.2018, 08:20
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Натуральная сортировка / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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