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

create table #t (r varchar(255))
insert into #t values ('A Z 4 5 1')
insert into #t values ('A Z 4 5 2')
insert into #t values ('A Z 4 5 3')
insert into #t values ('A Z 4 5 10')
insert into #t values ('A Z 4 5 24')
insert into #t values ('A Z 9 5')
insert into #t values ('A Z 5 7 1')
insert into #t values ('A Z 4 11')
insert into #t values ('A Z 5')
insert into #t values ('A A 5')
insert into #t values ('A Z 4 5 24 10')

A A 5
A Z 4 5 1
A Z 4 5 2
A Z 4 5 3
A Z 4 5 10
A Z 4 5 24
A Z 4 5 24 10
A Z 4 11
A Z 5
A Z 5 7 1
A Z 9 5


Количество вложений может быть неограниченно.
В данном примере кол-во вложенностей равно 4.

Как написать SELECT чтобы правильно отсортировал данные?
3 июн 11, 16:18    [10760222]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
сортировка, три варианта на выбор:
1. разложить по полям, цифери преобразовать в нечто буквенное, сложить обратно - сортировать по полученному.
2. Хранить служебное поле для сортировки, формировать его при вставке/модификации
3. найти того, кто придумал сию архитектуру и подвесить вниз головой, но не за ноги - пусть думает, как сортировать))).
3 июн 11, 16:25    [10760302]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
сортировка,

ORDER BY r COLLATE Latin1_General_BIN
3 июн 11, 16:25    [10760314]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Ken@t
сортировка,

ORDER BY r COLLATE Latin1_General_BIN

лажа
3 июн 11, 16:27    [10760339]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ken@t
сортировка,

ORDER BY r COLLATE Latin1_General_BIN
Так ведь "числа" в строке имеют разное количество разрядов.
Десятки (в числе 24, например) сравнивать с единицами (в числах 1 или 3) можно с любым COLLATION.
А толку-то?
3 июн 11, 16:32    [10760394]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
s.w.a.n.
Member

Откуда: Москва
Сообщений: 137
сортировка,
Количество вложений может быть неограниченно.
r varchar(255)
?
макс кол-во вложений = 128
3 июн 11, 16:36    [10760435]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
сортировка, вот один из вариантов:

SELECT t.r FROM (
SELECT t2.r, (
SELECT  RIGHT('00000' + t1.rr, 5) [data()]
FROM    ( SELECT    t.r,
                    CAST('<r><c>' + REPLACE(t.r, ' ', '</c><c>') + '</c></r>' AS XML) s
          FROM      #t t
        ) t
CROSS APPLY ( SELECT    x.z.value('.', 'varchar(max)') rr
              FROM      s.nodes('/r/c') x ( z )
            ) t1
WHERE t.r=t2.r
FOR     XML PATH('') ) sort
FROM #t t2
) t
ORDER BY t.sort
3 июн 11, 16:38    [10760458]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
s.w.a.n.
Member

Откуда: Москва
Сообщений: 137
kDnZP
вот один из вариантов:
о, возьму на заметку!)... всё никак не освою эти XML...
3 июн 11, 16:48    [10760569]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
сортировка
Guest
Спасибо! Работает вариант :)
Есть какие-то варианты без использования XML?
3 июн 11, 17:05    [10760682]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
сортировка
Guest
SELECT  RIGHT('00000' + t1.rr, 5) [data()]

Зачем добавляются нолики?
3 июн 11, 17:07    [10760692]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка значений  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
В СУБД не хранят данные абы как, а проектируют структуру БД под задачу. В данном случае не спроектировано.
Решение: перепроектировать.

PS: Ещё вариант:
DECLARE	@Table TABLE (Value VarChar(255))
INSERT	@Table VALUES
 ('1 33 4 5 1')
,('1 33 4 5 2')
,('1 33 4 5 3')
,('1 33 4 5 10')
,('1 33 4 5 24')
,('1 33 9 5')
,('1 33 5 7 1')
,('1 33 4 11')
,('1 33 5')
,('1 1 5')
,('1 33 4 5 24 10')
----------------------------------------
SELECT	*
FROM	@Table
ORDER BY hierarchyid::Parse('/' + Replace(Value,' ','/') + '/')
4 июн 11, 00:48    [10762335]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить