Есть ли способ поместить невидимый символ в начало строки, чтобы изменить порядок ее сортировки? - PullRequest
14 голосов
/ 09 февраля 2011

Есть ли способ поместить непечатаемый или не навязчивый символ в начало строки данных в sqlserver.чтобы при выполнении порядка по строка сортировалась после буквы z в алфавитном порядке?

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

Я бы предпочел не помещать в таблицу другое поле, такое как "SortOrder", чтобы использовать его для упорядочения сортировки, и мне не пришлось бы сортировать список в моем коде.

Добавлено: Да, я знаю, что это плохая идея, спасибо всем за то, что упомянули об этом, но все же, мне любопытно, можно ли выполнить то, что я прошу

Ответы [ 6 ]

9 голосов
/ 10 февраля 2011

Поскольку никто не решается ответить на ваш вопрос должным образом, вот мой ответ

Учитывая: Вы уже добавляете <space> к некоторым другим данным, чтобы они отображались сверху

Решение: Добавьте CHAR (160), чтобы он появился внизу.В действительности это также пространство, но оно предназначено для компьютерных систем, чтобы не рассматривать его как разрыв слова (отсюда и название).

http://en.wikipedia.org/wiki/Non-breaking_space

Ваши требования:

  1. Без добавления другого поля, такого как "SortOrder", к таблице
  2. Без сортировки списка в вашем коде

Я думаю, это подходит!

create table my(id int,data varchar(100))
insert my
select 1,'Banana' union all
select 2,Char(160) + 'mustappearlast' union all
select 3,' ' +N'mustappearfirst' union all
select 4,'apple' union all
select 5,'pear'

select *
from my
order by ASCII(lower(data)), data

(хорошо, я обманул, мне пришлось добавить ASCII(lower(, но это ближе к вашим требованиям, чем все остальные ответы на данный момент)

2 голосов
/ 09 февраля 2011

Вы должны использовать другой столбец в базе данных, чтобы помочь указать порядок, а не изменять строку:

SELECT *
FROM yourtable 
ORDER BY sortorder, yourstring

Где ваши данные могут выглядеть так:

yourstring               sortorder
foo                      0
bar                      0
baz                      1
qux                      1
quux                     2

Если выне можете изменить таблицу, вы можете поместить столбец сортировщика в другую таблицу и соединиться, чтобы получить его:

SELECT *
FROM yourtable AS T1
JOIN yourtablesorting AS T2
ON T1.id = T2.T1_id
ORDER BY T2.sortorder, T1.yourstring

Альтернативное решение:

Если вы действительно можетеНе изменяйте базу данных вообще, даже не добавляя новую таблицу, тогда вы можете добавить любой символ, который вам нравится, в начале строки и удалить его во время выбора:

SELECT RIGHT(yourstring, LEN(yourstring) - 1)
FROM yourtable
ORDER BY yourstring
1 голос
/ 09 февраля 2011

Вы можете установить порядок сортировки в запросе и использовать объединения (без гарантий производительности).

select 1 as SortOrder, *
from table
where ... --first tier
union
select 2, *
from table
where ... --second tier
order by SortOrder
1 голос
/ 09 февраля 2011

Не могли бы вы включить что-то вроде:

"<SORT1>This is my string"
"<SORT2>I'd like this to go second"

И удалить их позже? Я думаю, что использование невидимых символов хрупко и хакерски.

0 голосов
/ 09 февраля 2011

Я со всеми остальными, что идеальный способ сделать это - добавить дополнительный столбец для порядка сортировки.

Но если вы не хотите добавлять другой столбец, и вы уже используете пробелдля тех элементов, которые вы хотите отображать в верхней части списка, как вы относитесь к использованию канала (|) для элементов в нижней части списка?

По умолчанию , SQLСервер использует набор символов Unicode для своей сортировки.В Unicode труба и обе фигурные скобки ({,}) идут после z, поэтому любой из этих трех символов должен работать для вас.

0 голосов
/ 09 февраля 2011

На мой взгляд, невидимый символ для этой цели - плохая идея, потому что он загрязняет данные.Я бы сделал именно то, что вы бы предпочли не делать, и добавил бы новый столбец.

Чтобы немного изменить идею, вы можете реализовать ее не как порядок сортировки, а как порядок группировки, по умолчанию 0, где отрицательныйцелое число помещает группу вверху списка и целое положительное число внизу, а затем "order by sort_priority, foo"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...