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

Откуда: СПб
Сообщений: 270
Всем добрый день!

есть такие данные
IDPAGEREF_PAGEREF_REV
12NULL4
23NULL4
34NULL4
45NULL4
56NULL4
67NULL4
78NULL4
89ULL4
910NULL4
1011NULL4
1112NULL4
1213NULL4
1314NULL4
14134
151144
16234


После не долгих мохинаций получается следующее
IDPAGEREF_PAGEREF_REV
12NULL4
23NULL4
34NULL4
45NULL4
56NULL4
67NULL4
78NULL4
89ULL4
910NULL4
1011NULL4
1112NULL4
1213NULL4
1314NULL4
144.134
154.1.1144
164.234

и теперь это надо отсортировать

IDPAGEREF_PAGEREF_REV
12NULL4
23NULL4
34NULL4
144.134
154.1.1144
164.234
45NULL4
56NULL4
67NULL4
78NULL4
89ULL4
910NULL4
1011NULL4
1112NULL4
1213NULL4
1314NULL4


Подскажите, пжт, как бы это сделать?
9 окт 14, 12:47    [16681251]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Добрый Э - Эх
Guest
Веткин Сергей,

добить слева пробелами до одной длины
9 окт 14, 12:56    [16681311]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Добрый Э - Эх
Веткин Сергей,

добить слева пробелами до одной длины
Нефига не поможет.
Ему ж надо, чтобы 4 и 4.1 и 4.1.1 были рядом
9 окт 14, 13:03    [16681377]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Добрый Э - Эх,

т.е. получается, что придется делать дважды почти одну и туже операцию, сначала привести к удобочитаемому виду, а потом сделать почти тоже самое, только приводя к единой длине?
9 окт 14, 13:04    [16681387]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Добрый Э - Эх
Веткин Сергей,

добить слева пробелами до одной длины
Нефига не поможет.
Ему ж надо, чтобы 4 и 4.1 и 4.1.1 были рядом
Надо все значения добить справа нулями с точками (точек одно и то же количество),
а количество цифр в каждой группе между точками - нулями (ну, или пробелами) слева до одной и той же длины.
9 окт 14, 13:07    [16681410]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Веткин Сергей
Добрый Э - Эх,

т.е. получается, что придется делать дважды почти одну и туже операцию, сначала привести к удобочитаемому виду, а потом сделать почти тоже самое, только приводя к единой длине?
Все манипуляции с полем для сортировки надо делать только в выражении ORDER BY.
Показывать-то в SELECTе можно само поле, как и раньше.
9 окт 14, 13:09    [16681421]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
vso
Member

Откуда: СПб
Сообщений: 270
iap,

т.е. без двойной работы не обойтись?
9 окт 14, 13:10    [16681428]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Как-то так:
declare @t1 table (f1 int, f2 char(5), f3 int, f4 int)
insert into @t1 values
(1,	'2',	NULL,	4),
(2,	'3',	NULL,	4),
(3,	'4',	NULL,	4),
(4,	'5',	NULL,	4),
(5,	'6',	NULL,	4),
(6,	'7',	NULL,	4),
(7,	'8',	NULL,	4),
(8,	'9',	NULL,	4),
(9,	'10',	NULL,	4),
(10,	'11',	NULL,	4),
(11,	'12',	NULL,	4),
(12,	'13',	NULL,	4),
(16,	'4.2',	3,	4),
(14,	'4.1',	3,	4),
(15,	'4.1.1',	14,	4),
(13,	'14',	NULL,	4)

select * from @t1
order by cast(left(f2, patindex('%[. ]%',f2)-1) as int), left(f2, patindex('%[. ]%',f2)-1), replace(f2,'.','')
9 окт 14, 13:12    [16681445]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Веткин Сергей
iap,

т.е. без двойной работы не обойтись?
Какой "двойной работы", я не пойму?
Работать будет сервер, не беспокойтесь.

Вы только выражение напишите, о котором я говорил.
Например, наверняка известно максимальное количество точек, разделяющих группы цифр?
Вы, конечно, знаете максимальное количество цифр между точками?
Так сообщите, уже наконец, всё это!
9 окт 14, 13:13    [16681461]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Второй аргумент линий в сортировке, не вычистил.
9 окт 14, 13:14    [16681464]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Glory
Member

Откуда:
Сообщений: 104751
Веткин Сергей
После не долгих мохинаций получается следующее

Пусть во время ваших махинацию с полям сделают вот такие значения
declare @V table(f1 varchar(10)) 
INSERT @V values('01'),('02'),('20'),('01.01'),('01.02'),('01.01.01'),('20.01'),('20.01.01'),('20.02'),('02.01'),('02.02'),('02.01.01'),('10'),('10.01'),('10.01.01')

select * from @V order by f1
9 окт 14, 13:59    [16681834]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
vso
Member

Откуда: СПб
Сообщений: 270
iap
Какой "двойной работы", я не пойму?
Работать будет сервер, не беспокойтесь.


я о нем и беспокоюсь, т.к. сейчас на маленьком кол-ве дынных конечно же все летает, но опыт показывает, что как только кол-во строк серьезно возрастает, идудт тормоза. А чтобы получить значения с точками, я использую рекурсию и два раза ее прогонять не хочется, чтобы получить значение необходимое и с проставленными нулями в нужных местах

iap
Например, наверняка известно максимальное количество точек, разделяющих группы цифр?
Вы, конечно, знаете максимальное количество цифр между точками?
Так сообщите, уже наконец, всё это!


Теоретически максимальное кол-во точек, как собственно и кол-во цифр не ограничено. На практике же я надеюсь, что дальше приведенного примера не уйдет. Что не исключает универсального решения
9 окт 14, 14:48    [16682235]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
А нельзя было оставить всё как есть, сортировать по трём числовым колонкам, а ваше поле '4.1.3' сделать вычисляемым?

Веткин Сергей
IDPAGEREF_PAGEREF_REV
12NULL4
23NULL4
34NULL4
45NULL4
56NULL4
67NULL4
78NULL4
89ULL4
910NULL4
1011NULL4
1112NULL4
1213NULL4
1314NULL4
14134
151144
16234

9 окт 14, 14:54    [16682283]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
declare @t table(p varchar(100))

insert into @t values ('1.1'),('1.10'),('1.2'),('1.10.1'),('1.10.2'),('1.10.2.1'),('1.10.2.2'),('1.3'),('1.2.1'),('1.3.1'),('1.1.1.4'),('3.2.2'),('1.1.1.4.2' )

select p
from @t
order by
 cast('/' + replace(p, '.', '/') + '/' as hierarchyid);
9 окт 14, 14:59    [16682324]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Веткин Сергей,

А чем мой вариант плох, не пойму?
9 окт 14, 15:00    [16682326]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Бывают подразделы больше 9, что ли? Надо же было в примере это отобразить...
9 окт 14, 15:02    [16682344]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
vso
Member

Откуда: СПб
Сообщений: 270
a_voronin
А нельзя было оставить всё как есть, сортировать по трём числовым колонкам


Как такого добиться, учитывая, что REF_PAGE это ссылка на строку "родитель" и PAGE может быть как NULL (все значения будут в переди), так и числовые.

a_voronin
, а ваше поле '4.1.3' сделать вычисляемым?


И это я не представляю как сделать
9 окт 14, 15:09    [16682399]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Владислав Колосов
А чем мой вариант плох, не пойму?


я сейчас сделал на основе вашего таким образом:

WITH T1 AS
(
  SELECT Lv.ID_LISTVOLUME,
         Lv.NAME,
         CASE WHEN Lv.Ref_ListVolume IS NULL THEN CAST(Lv.PAGE AS nvarchar(255)) ELSE
         dbo.fGetNumberPage(lv.REF_REV, lv.ID_LISTVOLUME) END AS PAGE,
         Lv.TypePage,
         Lv.NOTICE,
         Lv.REF_REV AS ID_REVISIONS,
         Lv.Ref_ListVolume
  FROM dbo.ListVolume Lv
  WHERE Lv.REF_REV = @REF
)

SELECT *
FROM T1
ORDER BY CASE
  WHEN Ref_ListVolume IS NULL THEN CAST(PAGE AS int)
  ELSE CAST(LEFT(PAGE, PATINDEX('%[. ]%', PAGE) - 1) AS int)
END, REPLACE(PAGE, '.', '')
9 окт 14, 15:13    [16682416]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Веткин Сергей,

Ну тык срочно RTFM-ить на эту тему надо:
http://technet.microsoft.com/ru-ru/library/ms191250(v=sql.105).aspx
http://technet.microsoft.com/ru-ru/library/ms174979(v=sql.90).aspx
К. Использование выражения для вычисляемого столбца
В следующем примере показано использование выражения ((low + high)/2) для вычисления столбца myavg.
CREATE TABLE dbo.mytable
( low int, high int, myavg AS (low + high)/2 ) ;

Л. Создание вычисляемого столбца на основе столбца пользовательского типа
В следующем примере создается таблица с одним столбцом, определенным пользовательским типом utf8string, и предполагается, что как сборка, содержащая данный тип, так и сам тип, уже созданы в текущей базе данных. Второй столбец определяется на основе типа utf8string и использует метод ToString() типа type(class) utf8string для вычисления значения столбца.
CREATE TABLE UDTypeTable
( u utf8string, ustr AS u.ToString() PERSISTED ) ;
9 окт 14, 16:03    [16682723]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Glory
Member

Откуда:
Сообщений: 104751
Уже предложено работающее решение 16682324, если кто не заметил
9 окт 14, 16:05    [16682728]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Веткин Сергей
a_voronin
А нельзя было оставить всё как есть, сортировать по трём числовым колонкам


Как такого добиться, учитывая, что REF_PAGE это ссылка на строку "родитель" и PAGE может быть как NULL (все значения будут в переди), так и числовые.


ISNULL(REF_PAGE, '')+ ISNULL('.' + PAGE, '') ...

или

CONCAT(REF_PAGE, '.' + PAGE, ...) на SQL 2012
9 окт 14, 16:06    [16682740]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
Уже предложено работающее решение 16682324, если кто не заметил


Мы обсуждаем вариант сортировки по исходным числовым полям. С формированием строки в вычисляемом поле.
9 окт 14, 16:08    [16682751]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
Мы обсуждаем вариант сортировки по исходным числовым полям. С формированием строки в вычисляемом поле.

И как же вы будете вычислять иерархию для каждой записи ?
Писать функцию, чтобы вызывать ее для каждой записи ?
9 окт 14, 16:11    [16682777]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory
a_voronin
Мы обсуждаем вариант сортировки по исходным числовым полям. С формированием строки в вычисляемом поле.

И как же вы будете вычислять иерархию для каждой записи ?
Писать функцию, чтобы вызывать ее для каждой записи ?


вот и я про это же спрашивал
9 окт 14, 16:36    [16682955]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений char по правилам int  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Веткин Сергей
Glory
пропущено...

И как же вы будете вычислять иерархию для каждой записи ?
Писать функцию, чтобы вызывать ее для каждой записи ?


вот и я про это же спрашивал


Давайте тогда озвучим версию SQL сначала?
9 окт 14, 16:50    [16683050]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить