Есть ли способ поместить невидимый символ в начале строки, чтобы изменить порядок сортировки?

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

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

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

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

Ответ 1

Поскольку никто не рискнет ответить на ваш вопрос правильно, вот мой ответ

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

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

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

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

  • Не добавляя в таблицу другое поле типа SortOrder
  • Без сортировки списка в вашем коде

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

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

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

SELECT *
FROM yourtable 
ORDER BY sortorder, yourstring

Где вы можете выглядеть так:

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

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

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

Ответ 3

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

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

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

Ответ 4

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

select 1 as SortOrder, *
from table
where ... --first tier
union
select 2, *
from table
where ... --second tier
order by SortOrder

Ответ 5

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

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

Ответ 6

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

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

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