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

Откуда: Санкт-Петербург
Сообщений: 5489
Как получить символ NCHAR, который сортировался бы не раньше всех остальных символов?
10 ноя 14, 17:09    [16823911]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Dmitry V. Liseev
Как получить символ NCHAR, который сортировался бы не раньше всех остальных символов?

всмысле поже всех? Или как ?
10 ноя 14, 17:10    [16823919]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
o-o
Guest
нагенерить коды юникода,
вывести top 1 nchar(n) ... order by 1 desc
10 ноя 14, 17:14    [16823949]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Maxx
Dmitry V. Liseev
Как получить символ NCHAR, который сортировался бы не раньше всех остальных символов?

всмысле поже всех? Или как ?
Позже себя самого он не может сортироваться. Так что можно считать позже всех остальных.
10 ноя 14, 17:15    [16823954]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
o-o
нагенерить коды юникода,
вывести top 1 nchar(n) ... order by 1 desc


SELECT
	seq.num + 65530 num,
	NCHAR(seq.num + 65530) sym,
	UNICODE(NCHAR(seq.num + 65530)) r_num
FROM
	(
	SELECT TOP 10
		ROW_NUMBER() OVER (ORDER BY object_id) num
	FROM
		sys.objects
	) seq
UNION ALL
SELECT
	49 num,
	NCHAR(49) sym,
	UNICODE(NCHAR(49)) rnum
ORDER BY sym ASC;



numsymr_num
65536NULLNULL
65537NULLNULL
65538NULLNULL
65539NULLNULL
65540NULLNULL
6553165531
6553265532
6553365533
6553465534
65535￿65535
49149
10 ноя 14, 17:18    [16823970]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Хотелось бы понять принцип. Иначе на каком-то другом сервере этот код перестанет работать.
10 ноя 14, 17:19    [16823979]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Dmitry V. Liseev
Хотелось бы понять принцип. Иначе на каком-то другом сервере этот код перестанет работать.


Вам нужно понять, что порядок сортировки определяется COLLATION. Если вам нужен определенный порядок, то надо озаботиться тем, чтобы привести ваши NCHAR к нужному collation даже если это UNICODE.
10 ноя 14, 17:23    [16824017]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
a_voronin,
WITH seq AS (
	SELECT TOP 256
		-1 + ROW_NUMBER() OVER (ORDER BY object_id) num
	FROM
		sys.objects
	) 
SELECT * FROM 
(
SELECT
	s1.num * 256 + s2.num  num,
	NCHAR(s1.num * 256 + s2.num ) sym,
	UNICODE(NCHAR(s1.num * 256 + s2.num )) r_num
FROM seq as s1, seq as s2
) F
ORDER BY sym COLLATE SQL_Latin1_General_Cp437_BIN ASC
10 ноя 14, 17:30    [16824076]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
a_voronin
Dmitry V. Liseev
Хотелось бы понять принцип. Иначе на каком-то другом сервере этот код перестанет работать.


Вам нужно понять, что порядок сортировки определяется COLLATION. Если вам нужен определенный порядок, то надо озаботиться тем, чтобы привести ваши NCHAR к нужному collation даже если это UNICODE.
Хорошо. Как узнать, какой символ будет последним в том или ином COLLATION? Только методом тыка?
10 ноя 14, 17:34    [16824109]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
SELECT TOP 10
	seq.num,
	NCHAR(seq.num) sym
FROM
	(
	SELECT TOP 70000
		ROW_NUMBER() OVER (ORDER BY a.[object_id]) num
	FROM
		sys.objects a
		CROSS JOIN sys.objects b
	) seq
ORDER BY NCHAR(seq.num) DESC;


numsym
1617ّ
12293
12337
12338
12445
12446
12540
12541
12542
65148


Это был какой COLLATION ?
10 ноя 14, 17:40    [16824147]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Dmitry V. Liseev
Это был какой COLLATION ?

Сервера или базы. Какой именно из двух - выясняйте при прочтении http://msdn.microsoft.com/ru-ru/library/ms184391.aspx
10 ноя 14, 17:46    [16824185]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
guest45
Guest
Dmitry V. Liseev
Хотелось бы понять принцип.


http://en.wikipedia.org/wiki/Collation
http://www.unicode.org/reports/tr10/
10 ноя 14, 18:07    [16824311]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
o-o
Guest
тест нечестный, т.к. вы не 10 последних из всех вывели,
а просто 10, к-ые сами же и решили выбрать и к-ые отсортировали среди них самих десятерых.
это для бинарной сортировки так прокатит, т.к. на код символа ориентируется,
а для произвольного collation надо все перебрать
10 ноя 14, 18:09    [16824323]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Dmitry V. Liseev
Хотелось бы понять принцип. Иначе на каком-то другом сервере этот код перестанет работать.


почему бы тогда явно не указать, что заданная строка должна выводиться последней. путем введения еще одного стоблца, отвечающего за порядок, помимо того, что уже есть. вместо того, чтобы искать "волшебные" символы.
10 ноя 14, 18:17    [16824373]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Dmitry V. Liseev,

по моему тут стоит задать вопрос - а зачем собственно это надо?
на мой взгляд какая-то вымученная задача
10 ноя 14, 18:22    [16824401]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
o-o
Guest
Dmitry V. Liseev
SELECT TOP 10
	seq.num,
	NCHAR(seq.num) sym
FROM
	(
	SELECT TOP 70000
		ROW_NUMBER() OVER (ORDER BY a.[object_id]) num
	FROM
		sys.objects a
		CROSS JOIN sys.objects b
	) seq
ORDER BY NCHAR(seq.num) DESC;


numtsym
1617tّ
12293t々
12337t〱
12338t〲
12445tゝ
12446tゞ
12540tー
12541tヽ
12542tヾ
65148tﹼ


Это был какой COLLATION ?

извиняюсь, вот это уже был правильный тест,
и вот эти вот приведенные в таблице символы всегда и будут последними.
кроме как при бинарной сортировке.
т.е. этим символам все равно и на case sensitivity, и на accent sensitivity
10 ноя 14, 18:38    [16824498]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
leov
Dmitry V. Liseev,

по моему тут стоит задать вопрос - а зачем собственно это надо?
на мой взгляд какая-то вымученная задача
В задаче дерево. Оно должно выводится по веткам (элементы одной ветки должны быть рядом). А внутри каждой ветки отсортировано по комбинации полей (как числовых, так и символьных). Для этого приходится рекурсивно строить специальный сортировочный индекс - текстовую строку, по которой потом будет отсортирована таблица. Если элементы поля NULL, такая запись должна идти последней в своей ветке. Именно для этого мне и надо в сортировочный индекс вместо NULL подставлять эти волшебные символы.

Для примера отсортируем дерево всего по одному текстовому полю "Значение".

Исходная таблица:
IDРодитель_IDЗначение
17Я
25NULL
351
47Ю
5NULLА
67Э
7NULLБ
852
96П


Правильно отсортированная таблица:
Сортировочный_индексIDРодитель_IDЗначение
А5NULLА
A.1351
A.2852
A.?????25NULL
Б7NULLБ
Б.Э67Э
Б.Э.П96П
Б.Ю47Ю
Б.Я17Я


Знаками ???? как раз отмечены эти волшебные символы в сортировочном индексе, которые всегда должны идти последними.
11 ноя 14, 09:14    [16826105]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
daw
Dmitry V. Liseev
Хотелось бы понять принцип. Иначе на каком-то другом сервере этот код перестанет работать.


почему бы тогда явно не указать, что заданная строка должна выводиться последней. путем введения еще одного стоблца, отвечающего за порядок, помимо того, что уже есть. вместо того, чтобы искать "волшебные" символы.
У меня дерево. Там не так просто всё.
11 ноя 14, 09:15    [16826111]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Возможно, есть другое решение без построения этого искусственного рекурсивного сортировочного индекса. У меня пока не получилось его найти.
11 ноя 14, 09:18    [16826122]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Dmitry V. Liseev
Знаками ???? как раз отмечены эти волшебные символы в сортировочном индексе, которые всегда должны идти последними.
Вместо поиска "волшебного" символа, приведите индекс к виду:
Сортировочный_индексIDРодитель_IDЗначение
A.01351
A.02852
A.125NULL
11 ноя 14, 10:17    [16826383]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ну так, а если вот такой сортировочный индекс получать:
Сортировочный_индексIDРодитель_IDЗначение
0.А5NULLА
0.A.0.1351
0.A.0.2852
0.A.1.а здесь нам уже неважно что25NULL
0.Б7NULLБ
0.Б.0.Э67Э
0.Б.0.Э.0.П96П
0.Б.0.Ю47Ю
0.Б.0.Я17Я


?
11 ноя 14, 10:22    [16826417]     Ответить | Цитировать Сообщить модератору
 Re: Последний символ при сортировке  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
invm
Dmitry V. Liseev
Знаками ???? как раз отмечены эти волшебные символы в сортировочном индексе, которые всегда должны идти последними.
Вместо поиска "волшебного" символа, приведите индекс к виду:
Сортировочный_индексIDРодитель_IDЗначение
A.01351
A.02852
A.125NULL
Видимо, так и придётся делать. К обычным значениям слева "0" добавлять, а NULL заменять на "1". Просто велась борьба за сокращение строки. Она ведь не резиновая. При большой глубине вложенности дерева может облом-с произойти.
11 ноя 14, 10:37    [16826509]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить