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

Откуда: Одесса
Сообщений: 6
Доброго времени суток!

В таблице поле содержит (например, Code[nvarchar]) следующие данные:
Item 1
Item 2
Item 3
Item 4
Item 10
Item 11
Item 12

как отсортировать, чтобы вывелось, как указано выше, а не
Item 1
Item 10
Item 11
Item 12
Item 2
Item 3
Item 4

Заранее спасибо.
23 дек 09, 01:07    [8104816]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
declare @items table (Code nvarchar(50))

insert into @items
select 'Item 4'  union
select 'Item 10' union
select 'Item 2'  union
select 'Item 12' union
select 'Item 3'  union
select 'Item 1'  union
select 'Item 11'

select *
from @items
order by convert(int, replace(Code, 'Item', ''))
23 дек 09, 02:53    [8104890]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
mushik
Member

Откуда: Одесса
Сообщений: 6
А если наряду с приведенными данными будут еще просто строки?
23 дек 09, 03:05    [8104894]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Егоров Александр
Member

Откуда: Хабаровск
Сообщений: 517
mushik,

А вы покажите это в примере как должно быть, если будут еще и просто строки :)
23 дек 09, 06:36    [8104934]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Проходимец
Member

Откуда: Москва
Сообщений: 571
Недавно делал похожую вещь
declare @items table (Code nvarchar(50))

insert into @items
select '4'  union
select '086-1' union
select '2'  union
select '120.1' union
select '03'  union
select '1'  union
select '' union 
select '086-2' union
select '11'


select *, b = dbo.func_seriestoint(code) from @items order by b, code

-- код функции
CREATE FUNCTION [dbo].[func_s2i] (@series_description varchar(255))
RETURNS int
AS BEGIN
	declare @result int
	declare @resultStr varchar(255)
	set @resultStr = isnull(@series_description, '0')

	declare @t table (a char)
	insert into @t 
		select '-' union 
		select '.' -- * 

	set @resultStr = @series_description
	declare @i int
	set @i = (select min(charindex(a, @resultStr)) from @t where charindex(a, @resultStr) > 0)
	set @i = isnull(@i, 0)
	if @i = 0
		select @resultStr = replace(@resultStr, a, '') from @t
	else
		select @resultStr = replace(substring(@resultStr, 1, @i), a, '') from @t
	set @result = convert(integer, @resultStr)	
	return @result
END


* в строке может быть больше `левых` символов, у меня они изначально на входе только такие.
23 дек 09, 08:36    [8105055]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Проходимец
Member

Откуда: Москва
Сообщений: 571
Правильный селект из @items с учетом названия функции
select *, b = dbo.func_s2i(code) from @items order by b, code
23 дек 09, 08:37    [8105058]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Проходимец
Member

Откуда: Москва
Сообщений: 571
И в коде функции второй
set @resultStr = @series_description
не нужен.
23 дек 09, 08:40    [8105065]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mushik
А если наряду с приведенными данными будут еще просто строки?
Что такое "просто строки"? Без цифр? С цифрами вперемешку с не-цифрами?
Опишите возможные форматы строк.
23 дек 09, 08:49    [8105083]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
aleks2
Guest
iap
mushik
А если наряду с приведенными данными будут еще просто строки?
Что такое "просто строки"? Без цифр? С цифрами вперемешку с не-цифрами?
Опишите возможные форматы строк.


В таком деле - неча херней маяться

1. Добавляем в таблицу или запрос вычисляемый столбец

RIGHT(REPLICATE (N'0', <длина поля>) + LTRIM(Code), <длина поля>) as CodeForOrderBy

2. Сортируем по нему.
23 дек 09, 08:57    [8105104]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
aleks2
iap
mushik
А если наряду с приведенными данными будут еще просто строки?
Что такое "просто строки"? Без цифр? С цифрами вперемешку с не-цифрами?
Опишите возможные форматы строк.


В таком деле - неча херней маяться
Алекс, а я-то чего? Я ничего...
23 дек 09, 09:07    [8105118]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
mushik
Member

Откуда: Одесса
Сообщений: 6
Спасибо всем за помощь, за ответы!

имел в виду, что в столбце могут находиться строки любого вида и любой длины:

Item 1
Bob
Item 2
Hello World
Item 3
Earth
Underground
Item 10
Item 11
Peter


С вычисляемым столбцом у меня получается прежний результат (неправильный)
RIGHT(REPLICATE (N'0', <длина поля>) + LTRIM(Code), <длина поля>) as CodeForOrderBy

Bob
Earth
Hello World
Item 1
Item 10
Item 11
Item 2
Item 3
Peter
Underground
23 дек 09, 11:58    [8106286]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
mushik
С вычисляемым столбцом у меня получается прежний результат (неправильный)
А правильный - это какой?
23 дек 09, 12:03    [8106313]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
aleks2
Guest
mushik
Спасибо всем за помощь, за ответы!

имел в виду, что в столбце могут находиться строки любого вида и любой длины:

Item 1
Bob
Item 2
Hello World
Item 3
Earth
Underground
Item 10
Item 11
Peter


С вычисляемым столбцом у меня получается прежний результат (неправильный)
RIGHT(REPLICATE (N'0', <длина поля>) + LTRIM(Code), <длина поля>) as CodeForOrderBy

Bob
Earth
Hello World
Item 1
Item 10
Item 11
Item 2
Item 3
Peter
Underground


Вычисляемый столбец не есть панацея от глупости.
23 дек 09, 12:08    [8106361]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
mushik
Member

Откуда: Одесса
Сообщений: 6
Правильной порядок следующий:

Bob
Earth
Hello World
Item 1
Item 2
Item 3
Item 10
Item 11
Peter
Underground
23 дек 09, 17:16    [8109165]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
тогда задача немножко усложняется.
необходимо вычленить из каждой строки числа, привести их к общему, удовлетворяемому разряду и сортировать по итоговой строке...

для спящего время бодрствования равносильно сну
23 дек 09, 17:36    [8109314]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Ну, например, можно так:
declare @items table (code nvarchar(50))

insert into @items
select 'item 4'  union
select 'item 10' union
select 'item 2'  union
select 'item 12' union
select 'item 3'  union
select 'item 1'  union
select 'item 11' union 
select 'hello world' union 
select 'underground'

select *
from @items
order by case when code like 'item [0-9]%' then 'item '+str(substring(code,6,100),100) else code end
Если в данных нет, конечно, всякой фигни после цифр. Если есть - извращайтесь дальше сами.
23 дек 09, 17:40    [8109344]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mushik
Правильной порядок следующий:

Bob
Earth
Hello World
Item 1
Item 2
Item 3
Item 10
Item 11
Peter
Underground
Повторю для Вас ещё раз:
ORDER BY Code, STR(STUFF(Code,1,PATINDEX(N'%[0-9]%',Code)-1,N''))
Вместо STR можно, конечно, и CAST в числовой тип сделать.
Или выровнять левыми пробелами или нулями по длине то, что возвращает STUFF.
23 дек 09, 17:43    [8109362]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
mushik
Правильной порядок следующий:

Bob
Earth
Hello World
Item 1
Item 2
Item 3
Item 10
Item 11
Peter
Underground
Повторю для Вас ещё раз:
ORDER BY Code, STR(STUFF(Code,1,PATINDEX(N'%[0-9]%',Code)-1,N''))
Вместо STR можно, конечно, и CAST в числовой тип сделать.
Или выровнять левыми пробелами или нулями по длине то, что возвращает STUFF.
Извините, глупо ошибся:
ORDER BY ISNULL(LEFT(Code, NULLIF(PATINDEX(N'%[0-9]%',Code),0)-1)+STR(STUFF(Code,1, PATINDEX(N'%[0-9]%',Code)-1,N'')),Code);
23 дек 09, 17:50    [8109414]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
mushik
Member

Откуда: Одесса
Сообщений: 6
используя последнюю строку, вылетает ошиьбка:
Error converting data type nvarchar to float.
24 дек 09, 18:09    [8115394]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
mushik
используя последнюю строку, вылетает ошиьбка:
Error converting data type nvarchar to float.
Скорее всего имеются строки, в которых после цифр опять попадаются не-цифры.
Поэтому и просил огласить возможный формат строки. Но меня игнорируют.
24 дек 09, 19:41    [8115688]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка строк с чиселами  [new]
mushik
Member

Откуда: Одесса
Сообщений: 6
iap
mushik
используя последнюю строку, вылетает ошиьбка:
Error converting data type nvarchar to float.
Скорее всего имеются строки, в которых после цифр опять попадаются не-цифры.
Поэтому и просил огласить возможный формат строки. Но меня игнорируют.


iap, Вас никто не игнорирует. Писал. что формат строки может быть любой:
строка,
число,
строка-число,
число-строка,
строка-число-строка,
число-строка-число..
тип колонки- nvarchar
26 дек 09, 01:50    [8121423]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить