Есть ли способ поместить невидимый символ в начале строки, чтобы изменить порядок сортировки?
Есть ли способ поставить непечатающий или не навязчивый символ в начале строки данных в 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, поэтому любой из этих трех символов должен работать на вас.