Установить порядок сортировки на основе алфавитного порядка другого поля - PullRequest
5 голосов
/ 02 декабря 2010

Недавно я добавил пару полей в некоторые таблицы в моей базе данных (SQL Server 2005), чтобы пользователи могли настраивать порядок сортировки строк. Я следовал этому шаблону для всех таблиц:

-- Alter the InvoiceStatus table
ALTER TABLE [dbo].[InvoiceStatus] ADD [Disabled] bit NOT NULL DEFAULT 0
GO
ALTER TABLE [dbo].[InvoiceStatus] ADD [SortOrder] int NOT NULL DEFAULT 0
GO
-- Use the primary key as the default sort order
UPDATE [dbo].[InvoiceStatus]
   SET [SortOrder] = [InvoiceStatusId]
GO

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

Используя приведенную выше таблицу в качестве примера (в которой есть текстовое поле [InvoiceStatusName]), можно ли написать такой же приятный и короткий запрос, чтобы использовать алфавитный порядок [InvoiceStatusName] в качестве порядка сортировки по умолчанию?

Обновление:
На этот вопрос уже дан ответ, но некоторые отметили, что это решение может быть не идеальным, поэтому я просто хочу добавить некоторый контекст для будущих ссылок. Это старая система (не старая, но уже несколько лет), используемая в нескольких разных местах.

В приложении имеется несколько списков / раскрывающихся списков с типичным типом «статуса» (например, статус счета , статус заказа , тип клиента так далее.). Назад, когда система была впервые написана, это были стандартные значения, используемые везде (не предназначенные для изменения каким-либо образом), но некоторые пользователи начали запрашивать возможность добавлять новые статусы, удалять те, которые больше не используются, и указывать пользовательские порядок сортировки (один статус может использоваться чаще, и поэтому желательно иметь его в верхней части списка).

Самым простым способом, который я нашел для этого (без необходимости слишком много возиться со старым кодом), было добавление двух новых полей, Disabled и SortOrder, для всех соответствующих таблиц. Поле Disabled используется для «скрытия» неиспользуемых типов (не может удалить их из-за ссылочной целостности, и значение, которое они содержат, также необходимо сохранить), а поле SortOrder там, чтобы пользователи могли указать свой собственный порядок сортировки. Поскольку все соответствующие таблицы также совместно используют эти два столбца, было очень легко создать простой интерфейс для обработки сортировки (и отключения) общим способом.

Ответы [ 3 ]

6 голосов
/ 02 декабря 2010
;WITH so AS
(
SELECT 
   SortOrder,
   ROW_NUMBER() OVER (ORDER BY InvoiceStatusName) AS rn
FROM   dbo.InvoiceStatus
)
UPDATE so SET SortOrder = rn
4 голосов
/ 02 декабря 2010

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

UPDATE  dbo.InvoiceStatus
SET     SortOrder = ivsn.Number
FROM    dbo.InvoiceStatus ivs
        INNER JOIN (
          SELECT dbo.InvoiceStatusID
                 , [number] = ROW_NUMBER() OVER (ORDER BY InvoiceStatusName)
          FROM   dbo.InvoiceStatus
        ) ivsn ON ivsn.InvoiceStatusID = ivs.InvoiceStatusID

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

1 голос
/ 02 декабря 2010

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

Действительно, я бы порекомендовал вам перестроить подсистему сортировки другим способом.* Например, иметь где-нибудь таблицу метаданных, содержащую имя столбца, по которому пользователи хотят отсортировать данные, а затем использовать ORDER BY (columnname) для соответствующих запросов

edit: Ой, подождите, мы говорим о поискетаблицы и позволяя пользователям изменить порядок.Теперь я понял, что ваша реализация имеет для меня гораздо больше смысла.

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