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

Откуда:
Сообщений: 206
Добрый день! подскажите пожалуйста, мне в бд 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
но он не сортирует так, как хотелось бы.
23 мар 18, 08:07    [21279361]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27753
Как-то так:
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)
23 мар 18, 08:30    [21279391]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
skyANA,

не сортирует
23 мар 18, 08:45    [21279420]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
TsYekaterina,

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)
23 мар 18, 08:59    [21279443]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
left(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )-1)
- выделяет часть наименования до "М00", по ней можно не сортировать
23 мар 18, 09:01    [21279446]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
Kopelly,

try_cast не является известным имя встроенной функции.
23 мар 18, 09:03    [21279449]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
кролик-зануда
Guest
Kopelly,

если у вас текст до чисел статичный, то можно сортировать по len(Stand.Mark), Stand.Mark
23 мар 18, 09:15    [21279484]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
кролик-зануда,
надо именно не по длине строки, а по числам. такой запрос немного не то даст
23 мар 18, 09:19    [21279495]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
TsYekaterina, тогда обычным cast'ом

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)
23 мар 18, 09:21    [21279511]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
кролик-зануда
Guest
TsYekaterina,

а вы проверяли, то или не то(с учетом заданных мной ограничений)?
23 мар 18, 09:22    [21279514]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
кролик-зануда,

да, проверяла
23 мар 18, 09:26    [21279527]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
кролик-зануда
Guest
TsYekaterina,

а можно примерчик того, что отсортировалось не так?
23 мар 18, 09:29    [21279535]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
Kopelly,

все нормалек! спасибо!
23 мар 18, 09:29    [21279536]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
На случай если не во всех строках есть "Мхх":

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
23 мар 18, 09:30    [21279541]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
Kopelly,

премного благодарна!
23 мар 18, 09:39    [21279578]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
TsYekaterina,

 select * 
 from 
 (
    values ('текст М10'),
('текст М12'),
('текст М14'),
('текст М16'),
('текст М5'),
('текст М6'),
('текст М8')
 ) t1 (f1)
order by  REVERSE(cast(f1 as char(10)))
23 мар 18, 13:24    [21280589]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
msLex
Member

Откуда:
Сообщений: 8091
order by 
    cast(right(f1, (patindex('%[^0-9]%', reverse(f1))) - 1) as int)
23 мар 18, 13:31    [21280632]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
в продолжение темы...
а если нужно отсортировать, например, десятичные дроби:
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.Хим.Пас
причем, разделитель может быть не только буква "х", но и "-"
9 апр 18, 12:25    [21323059]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
TsYekaterina,

Вы хотите применить к нереляционным данным реляционные запросы. Превратите эту свалку к требованиям хотя бы первой нормальной формы, а потом сортируйте. Или сортируйте на стороне клиентского приложения.
9 апр 18, 12:57    [21323208]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
Владислав Колосов,

я сортирую локально через sql запрос.
9 апр 18, 15:08    [21323840]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
iap
Member

Откуда: Москва
Сообщений: 46982
TsYekaterina
Владислав Колосов,

я сортирую локально через sql запрос.
SQL запрос обрабатывается на сервере, а не локально
9 апр 18, 15:10    [21323846]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
вопрос закрыт, разобралась...
9 апр 18, 15:44    [21324013]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Konst_One
Member

Откуда:
Сообщений: 11521
поведайте всем как решили

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

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')
9 апр 18, 16:15    [21324137]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Konst_One,

И куда отсортирует "10х5"?
10 апр 18, 04:56    [21325000]     Ответить | Цитировать Сообщить модератору
 Re: Натуральная сортировка  [new]
TsYekaterina
Member

Откуда:
Сообщений: 206
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, '.', 'ц')
10 апр 18, 08:20    [21325117]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить