Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)

DECLARE @t TABLE (txt varchar(50))

INSERT INTO @t VALUES ('1.AAAAAAAAAAA')
INSERT INTO @t VALUES ('1.2 AAAAAAAAAAA')
INSERT INTO @t VALUES ('1.2.1.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('1.2.10.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('1.2.7.KKKKKKKKKKK')
INSERT INTO @t VALUES ('2. AAAAAAAAAAA')
INSERT INTO @t VALUES ('2.2 AAAAAAAAAAA')
INSERT INTO @t VALUES ('22.2.1.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('2.2.10.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('2.22.9.KKKKKKKKKKK')

SELECT * 
FROM @t t
ORDER BY 
    PATINDEX('%.%', t.txt),
    LEFT(t.txt, 1), 
    CONVERT(int , REPLACE(LEFT(t.txt, PATINDEX('%[^.0-9]%', t.txt) - 1), '.', ''))



Можно ли упростить код сортировки дерева?
6 сен 12, 10:11    [13121892]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Так точнее

SELECT *
FROM @t t
ORDER BY 
    CONVERT(int , LEFT(t.txt, PATINDEX('%.%', t.txt) - 1)),
    CONVERT(int , REPLACE(LEFT(t.txt, PATINDEX('%[^.0-9]%', t.txt) - 1), '.', ''))
6 сен 12, 10:15    [13121921]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
aleks2
Guest
Приведите номер к формату с постоянной шириной.

Или изучите тип hierarchyid.
6 сен 12, 10:17    [13121939]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

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

hierarchyid -это мудрено, не удалить и не добавить в дерево новое значение (нужны триггеры и т.д.)
hierarchyid - он появился в ms sql 2008 :)
Вот я и думаю, может 9 replace REPLACE ('txt''.1.', '.01.') для всех чисел?

Вот тестовый пример ещё
INSERT INTO @t VALUES ('1.AAAAAAAAAAA')
INSERT INTO @t VALUES ('1.2. AAAAAAAAAAA')
INSERT INTO @t VALUES ('1.2.1000.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('1.22.10.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('1.2.7.KKKKKKKKKKK')
INSERT INTO @t VALUES ('2. AAAAAAAAAAA')
INSERT INTO @t VALUES ('2.2 AAAAAAAAAAA')
INSERT INTO @t VALUES ('2.2.1.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('2.222.10.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('22.2.9.KKKKKKKKKKK')
6 сен 12, 10:25    [13122000]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

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

Сделал, как посоветовали (будет работать, если числа меньше 100)
SELECT * 
FROM @t t
ORDER BY
REPLACE( 
REPLACE(
REPLACE( 
REPLACE(
REPLACE( 
REPLACE(
REPLACE( 
REPLACE(
REPLACE(t.txt, '.1.','.01.')
, '.2.','.02.')
, '.3.','.03.')
, '.4.','.04.')
, '.5.','.05.')
, '.6.','.06.')
, '.7.','.07.')
, '.8.','.08.')
, '.9.','.09.')
6 сен 12, 10:55    [13122245]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ещё вариант:

SELECT *
FROM @t t
ORDER BY cast( coalesce ( parsename( txt, 4 ), parsename( txt, 3 ), parsename( txt, 2 ) ) as int )
       , cast( coalesce ( parsename( txt, 3 ), parsename( txt, 2 ) ) as int )
       , cast( parsename( txt, 2 ) as int )
6 сен 12, 10:58    [13122271]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
trew
hierarchyid -это мудрено, не удалить и не добавить в дерево новое значение (нужны триггеры и т.д.)
DECLARE	@Table TABLE (Value varchar(50))
INSERT	@Table VALUES
 ('1.AAAAAAAAAAA')
,('1.2 AAAAAAAAAAA')
,('1.2.1.HHHHHHHHHHHHHHHH')
,('1.2.10.HHHHHHHHHHHHHHHH')
,('1.2.7.KKKKKKKKKKK')
,('2. AAAAAAAAAAA')
,('2.2 AAAAAAAAAAA')
,('22.2.1.HHHHHHHHHHHHHHHH')
,('2.2.10.HHHHHHHHHHHHHHHH')
,('2.22.9.KKKKKKKKKKK')

SELECT	* 
FROM	@Table	T CROSS APPLY (SELECT
		HierarchyID::Parse('/' + Replace(Left(T.Value,NullIf(PatIndex('%[ .][^0-9.]%',T.Value),0)-1),'.','/') + '/')
	) X (Hierarchy)
ORDER BY Hierarchy
6 сен 12, 11:04    [13122314]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Knyazev Alexey,

Не получается отсортировать
DECLARE @t TABLE (txt varchar(50))

INSERT INTO @t VALUES ('1.AAAAAAAAAAA')
INSERT INTO @t VALUES ('1.2.10 AAAAAAAAAAA')
INSERT INTO @t VALUES ('2.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('1.2.8.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('1.2.2.11.HHHHHHHHHHHHHHHH')
INSERT INTO @t VALUES ('2.2.2.8.HHHHHHHHHHHHHHHH')

SELECT * 
FROM @t t
ORDER BY
REPLACE( 
REPLACE(
REPLACE( 
REPLACE(
REPLACE( 
REPLACE(
REPLACE( 
REPLACE(
REPLACE(t.txt, '.1.','.01.')
, '.2.','.02.')
, '.3.','.03.')
, '.4.','.04.')
, '.5.','.05.')
, '.6.','.06.')
, '.7.','.07.')
, '.8.','.08.')
, '.9.','.09.')


SELECT *
FROM @t t
ORDER BY
       --  cast( coalesce ( parsename( txt, 5 ), parsename( txt, 4 ), parsename( txt, 3 ), parsename( txt, 2 ) ) as int ) 
       --, 
       cast( coalesce ( parsename( txt, 4 ), parsename( txt, 3 ), parsename( txt, 2 ) ) as int )
       , cast( coalesce ( parsename( txt, 3 ), parsename( txt, 2 ) ) as int )
       , cast( parsename( txt, 2 ) as int )
6 сен 12, 11:23    [13122501]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

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

Работает, но мне нужно для ms sql 2005
6 сен 12, 11:25    [13122520]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Касательно вопроса.
Если это одноразовая работа - то сами можете решить её - неважно как.
Если нет, то нужно выровнять систему до более удобной, заранее прописать колонку сортировки в таблице.
Сортировку можно сделать многими способами и фиксированная длина ноды или эмулировать HierarchyID, али ещё как.
Разбирать все глюки анализа строки нет смысла.
6 сен 12, 17:35    [13125777]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
aleks2
Guest
trew
Не получается отсортировать

Ну чо ты такой простой? Равномерная ширина должна быть всегда равномерной

DECLARE	@Table TABLE (Value varchar(50))
INSERT	@Table VALUES
 ('01.00.00. AAAAAAAAAAA')
,('01.02.00. AAAAAAAAAAA')
,('01.02.01. HHHHHHHHHHHHHHHH')
,('01.02.10. HHHHHHHHHHHHHHHH')
,('01.02.07. KKKKKKKKKKK')
,('02.00.00. AAAAAAAAAAA')
,('02.02.00. AAAAAAAAAAA')
,('22.02.01. HHHHHHHHHHHHHHHH')
,('02.02.10. HHHHHHHHHHHHHHHH')
,('02.22.09. KKKKKKKKKKK')
7 сен 12, 05:39    [13127475]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

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

SELECT REPLACE('1.2.2.22', '.2.', '.02.') 

-- не работает (т.е. нет такого вида 1.02.02.22), поэтому сделал два раза повтор цифр.
Чтобы выровнять шириру, как подсказывает aleks2 .
13122245

Не понял мысль Mnior
прописать колонку сортировки в таблице.

Это получается, при добавлении нового значения update колонки сортировки? Не подходит.
7 сен 12, 11:40    [13128645]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
trew
aleks2,

SELECT REPLACE('1.2.2.22', '.2.', '.02.') 


-- не работает (т.е. нет такого вида 1.02.02.22)
Какого "вида" нет???
7 сен 12, 11:54    [13128758]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
trew
Это получается, при добавлении нового значения update колонки сортировки? Не подходит.
Огласите сразу список, что ещё не подходит.
7 сен 12, 11:55    [13128767]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

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

SELECT REPLACE('1.2.2.22', '.2.', '.02.')

-- результат '1.02.2.22'
-- а думал что получу '1.02.02.22'

Поэтому нагородил REPLACE-ов, как написал выше.
7 сен 12, 11:58    [13128790]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
trew
alexeyvg,

SELECT REPLACE('1.2.2.22', '.2.', '.02.')


-- результат '1.02.2.22'
-- а думал что получу '1.02.02.22'

Поэтому нагородил REPLACE-ов, как написал выше.
А, ну да, есть такая особенность работы REPLACE.

Это связано с тем, что REPLACE не заменяет пересекающиеся включения текста.

Нужно делать REPLACE 2 раза.
7 сен 12, 14:09    [13129949]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
aleks2
Guest
trew
alexeyvg,

SELECT REPLACE('1.2.2.22', '.2.', '.02.')

-- результат '1.02.2.22'
-- а думал что получу '1.02.02.22'

Поэтому нагородил REPLACE-ов, как написал выше.


Надо не REPLACE-ы городить, а хранить в фиксированном формате.
7 сен 12, 14:18    [13130045]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
trew
Это получается, при добавлении нового значения update колонки сортировки? Не подходит.
FacePalm.JPG
trew - вы не проггер, что не топик, то анекдот.

Откуда у вас цифры в строке? Вот они (к примеру) и должный быть этой колонке-сортировке.
А во вторых как вы заметите HierarchyID ничего не обновляет, но при этом "магическим" (для вас) способом сортирует. А вы не хотите подумать как это так оно работает?
7 сен 12, 17:17    [13131679]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
trew
Member

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

Откуда у вас цифры в строке?
Один человек проектирует бд, другой поддерживает.
7 сен 12, 17:29    [13131749]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка дерева вида 1.2.8. , 1.2.1. , 1.2.10 (ms sql 2005)  [new]
nezhadnye_my
Guest
есть еще вот такое разбиралово, как раз вложенность до 4-х.
вдруг поможет
select parsename('1.22.3',4), parsename('1.22.3',3), parsename('1.22.3',2), parsename('1.22.3',1)


1	2	3	4
NULL	1	22	3
7 сен 12, 18:00    [13131982]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить