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

Откуда:
Сообщений: 1022
Есть таблица TBL в ней поле ss1 типа string. В поле находятся только цифры.

1
10
12
2
23
25
3
31

как их отсортировать по возрастанию

1
2
3
10
12
23
25
31

Поле строковое!!!!!!!!!
11 окт 13, 12:51    [14956128]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Сконвертировать строку в число
11 окт 13, 12:52    [14956132]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
ORDER BY CONVERT(int,ss1) 
11 окт 13, 12:55    [14956157]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
sfsf
Member [скрыт]

Откуда:
Сообщений: 1022
Если в поле ss1 есть не только цифры.
1
10
12
2
23
25
3
31
Д1

как отсортировать по возрастанию
1
2
3
10
12
23
25
31
Д1
13 окт 14, 14:40    [16696992]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
На SQL 2012 TRY_PARSE (ss1 AS INT)

До SQL 2012 RIGHT('00000' + ss1, 6)
13 окт 14, 14:43    [16697039]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Wlr-l
Member

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

Если использовать order by try_parse(ss1 as int), то для нечисловых данных она вернет null, поэтому все нечисловые данные будут выведены перед числовыми.

with A as (
select *
  from (values ('1'),('10'),('31'),('Д1'),(' a1'),('a1'),('2'),('12')) as T(ss1)
)

select *
  from A
 order by try_parse(ss1 as int);


Результат:
ss1
a1
a1
Д1
1
2
10
12
31

В условиях задачи нечисловые данные должны следовать за числовыми.

В случае
order by right('0000'+ss1,5)
для тех же данных получим:

ss1
a1
1
2
3
10
12
23
25
31
a1
Д1
13 окт 14, 17:21    [16698275]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Wlr-l
a_voronin,

Если использовать order by try_parse(ss1 as int), то для нечисловых данных она вернет null, поэтому все нечисловые данные будут выведены перед числовыми.

with A as (
select *
  from (values ('1'),('10'),('31'),('Д1'),(' a1'),('a1'),('2'),('12')) as T(ss1)
)

select *
  from A
 order by try_parse(ss1 as int);


Результат:
ss1
a1
a1
Д1
1
2
10
12
31

В условиях задачи нечисловые данные должны следовать за числовыми.

В случае
order by right('0000'+ss1,5)
для тех же данных получим:

ss1
a1
1
2
3
10
12
23
25
31
a1
Д1


ТС утверждал сначала "В поле находятся только цифры." Потом изменил формулировку.

Вопрос к немё -- его устраивает второй вариант. Если там лидирующие пробелы есть, то ltrim можно.
13 окт 14, 17:30    [16698328]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
sfsf
Member [скрыт]

Откуда:
Сообщений: 1022
Может быть не совсем правильно выразился. Цель такая.
Поле ss1 - строковое. В нем содержатся числа и и строки. Например так:

20
2
12
7777
G3
ЖЕ77
ЖЕ7
5
1


Нужно, чтобы строки типа числа отсортировались по возрастанию, а следом (желательно) отсортировались смешанные данные

1
2
5
12
20
7777
ЖЕ7
ЖЕ77
G3
14 окт 14, 09:28    [16700253]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
OmgFail
Member

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

declare @t table (s varchar(100))

insert @t 
values ('1'),('G3'), ('12'),('20'), ('A1'), ('2'),('5'),('ЖЕ7'),('ЖЕ77'),('7777')

select * 
from @t 
order by case when try_parse(s as int) is not null then 1 else 2 end, 
            try_parse(s as int), s
14 окт 14, 10:39    [16700593]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
sfsf
Member [скрыт]

Откуда:
Сообщений: 1022
sql 2008 r2
14 окт 14, 11:21    [16700817]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
sfsf
sql 2008 r2
declare @x xml = '';
declare @t table (s varchar(100));

insert @t 
values ('1'),('G3'), ('12'),('20'), ('A1'), ('2'),('5'),('ЖЕ7'),('ЖЕ77'),('7777');

select
 t.*
from
 @t t cross apply
 (select cast(@x.value('xs:int(sql:column("t.s"))', 'varchar(10)') as sql_variant)) x(v) 
order by
 case when x.v is not null then 0 else 1 end,
 case when x.v is not null then cast(x.v as int) else x.v end;
14 окт 14, 11:32    [16700878]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Для полноты картины добавим в исходные данные пустую строку, строку "null", строку с лидирующими пробелами и строку с русской буквой А.

Варианты с try_parse и right отпадают сразу, так как дают "неправильную сортировку".

Рассмотрим интересный вариант от invm и еще один вариант, использующий функцию isnumeric:

declare @x xml = '';
declare @t table (s varchar(100))

insert @t 
values ('1'),('G3'), ('12'),('20'), ('A1'), ('2'),('5'),(''),('    ЖЕ7'),('ЖЕ7'),('ЖЕ77'),('7777'),('А1'),(null)

select
 t.*
from
 @t t cross apply
 (select cast(@x.value('xs:int(sql:column("t.s"))', 'varchar(10)') as sql_variant)) x(v) 
order by
 case when x.v is not null then 0 else 1 end,
 case when x.v is not null then cast(x.v as int) else x.v end;


select *
  from @t 
 order by 1-isnumeric(s)
         ,case when isnumeric(s)=1 then try_cast(s as int)  else null  end
         ,ltrim(s);


В первом случае получим:

1
2
5
12
20
7777
А1
NULL
A1
G3

ЖЕ7
ЖЕ7
ЖЕ77

Во втором случае получим:

1
2
5
12
20
7777
NULL

A1
G3
А1
ЖЕ7
ЖЕ7
ЖЕ77

Во втором случае идут в порядке возрастания числа, потом null-строки, пустые строки, строки, начинающиеся с латинской буквы и строки, начинающиеся (без учета лидирующих пробелов) с кириллической буквы. Что, наверно, более правильно.
14 окт 14, 15:34    [16702676]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @t table (s nvarchar(100))

insert @t 
values (N'1'),(N'G3'), (N'12'),(N'20'), (N'A1'), (N'2'),(N'5'),(N''),(N'    ЖЕ7'),(N'ЖЕ7'),(N'ЖЕ77'),(N'7777'),(N'А1'),(null),('-'),('.'),('1E02')

select *
from @t
order by patindex('%[^0-9]%',s), case when s like '%[^0-9]%' then null else cast(s as int) end
14 окт 14, 16:21    [16702944]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
А можно немного левый вопрос, но в тему: а сортировщика римских цифр ни у кого нет?
14 окт 14, 16:26    [16702977]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Glory,

Идея хорошая, но я бы добавил SIGN(patindex('%[^0-9]%',s))

declare @t table (s nvarchar(100))

insert @t 
values (N'1'),(N'G3'), (N'12'),(N'20'), (N'A1'), (N'2'),(N'5'),(N''),(N'    ЖЕ7'),(N'ЖЕ6'),(N'ЖЕ77'),(N'7777'),(N'А1'),(null),('-'),('.'),('1E02')

select *
from @t
order by SIGN(patindex('%[^0-9]%',s)), case when s like '%[^0-9]%' then null else cast(s as int) end
14 окт 14, 16:30    [16702997]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
a_voronin
А можно немного левый вопрос, но в тему: а сортировщика римских цифр ни у кого нет?
5995863
Там, конечно, не про сортировку, но можно допилить таблицу преобразования
римских чисел в десятичные и обратно. Тогда с ней можно было бы джойниться и сортировать целые числа
14 окт 14, 17:09    [16703202]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Согласен, идея использования patindex('%[^0-9]%',s) и SIGN(patindex('%[^0-9]%',s)) хорошая.

Теперь возникли следующие вопросы:

Строка '1E02' и число 100 - это одно и тоже?
Строка '-' и 0, строка '+' и 0 - это одно и тоже?
Как будут сортироваться дробные числа? Строка '12.5' и число 12,5 - это одно и тоже?

Если "да", то они должны попадать в секцию "числа", если "нет", то - в секцию "нечисла".

В случае "да" заменим try_cast(s as int) на try_cast(s as float) и получим:

declare @t table (s varchar(100))

insert @t 
values (N'1'),(N'G3'), (N'12'), (N'12.5'),(N'99'),(N'101'), (N'A1'),(N''),(N'    ЖЕ7'),(N'ЖЕ7'),(N'ЖЕ77'),(N'7777'),(N'А1'),(null),('-'),('-a'),('-0'),('+'),('+0'),('@'),('1E02')

select *
  from @t 
 order by  1-isnumeric(s)
         ,case when isnumeric(s)=1 then try_cast(s as float)  else null  end
         ,ltrim(s);


Результат:
-
+
+0
-0
1
12
12.5
99
1E02
101
7777
NULL

@
-a
A1
G3
А1
ЖЕ7
ЖЕ7
ЖЕ77
14 окт 14, 17:31    [16703343]     Ответить | Цитировать Сообщить модератору
 Re: сортировка СТРОКОВОГО поля с цифрами по возрастанию.  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
a_voronin,
Обычно чисел, записанных римскими цифрами, немного, скорее всего в пределах сотни. Таблица соответствия "РимскоеЧисло", "ДесятичноеЧисло" должно решить Вашу проблему без всяких преобразований.
14 окт 14, 17:38    [16703393]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить