簡體   English   中英

根據另一個字段的字母順序設置排序順序字段

[英]Set sort-order field based on alphabetically ordering of another field

我最近在我的數據庫(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]的字母順序作為默認排序順序?

更新:
問題已經得到解答,但有些人已經指出這個解決方案可能並不理想,所以我只想為將來的參考添加一些上下文。 這是一個舊系統(不是傳統的舊系統,但它已經存在了很多年)使用了一些不同的地方。

應用程序中有多個列表/下拉列表,具有典型的“狀態”類型(例如發票狀態訂單狀態客戶類型等)。 回到首次編寫系統時,這些是每個地方都在使用的標准值(不打算以任何方式進行更改),但是有些用戶已經開始請求添加新狀態,刪除不再使用的狀態並指定自定義排序順序(可能更頻繁地使用一種狀態,因此將其放在列表頂部是很好的)。

我發現這樣做最簡單的方法(不必亂用太多的舊代碼)是向所有相關表添加兩個新字段, DisabledSortOrder Disabled字段用於“隱藏”未使用的類型(由於參照完整性而無法刪除它們,並且還需要保留它們保存的值),並且SortOrder字段在那里,因此用戶可以指定自己的自定義排序訂購。 由於所有相關表也共享這兩個相同的列,因此很容易創建一個簡單的接口來以通用方式處理排序(和禁用)。

;WITH so AS
(
SELECT 
   SortOrder,
   ROW_NUMBER() OVER (ORDER BY InvoiceStatusName) AS rn
FROM   dbo.InvoiceStatus
)
UPDATE so SET SortOrder = rn

您可以使用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

你應該問問自己,這個方案是否是解決問題的最佳方案。 這樣的實現不能很好地擴展。

您選擇實現表排序的方式很不尋常,顯然僅限於按整數排序。

我真的建議你以另一種方式重新設計你的分揀子系統。

例如,在某個地方有一個元數據表,其中包含用戶想要排序的列的名稱,然后對相關查詢使用ORDER BY (columnname)

編輯:哦等等,我們正在討論查找表並讓用戶更改訂單。 現在我已經了解了你的實現對我來說更有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM