[英]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]
的字母順序作為默認排序順序?
更新:
問題已經得到解答,但有些人已經指出這個解決方案可能並不理想,所以我只想為將來的參考添加一些上下文。 這是一個舊系統(不是傳統的舊系統,但它已經存在了很多年)使用了一些不同的地方。
應用程序中有多個列表/下拉列表,具有典型的“狀態”類型(例如發票狀態 , 訂單狀態 , 客戶類型等)。 回到首次編寫系統時,這些是每個地方都在使用的標准值(不打算以任何方式進行更改),但是有些用戶已經開始請求添加新狀態,刪除不再使用的狀態並指定自定義排序順序(可能更頻繁地使用一種狀態,因此將其放在列表頂部是很好的)。
我發現這樣做最簡單的方法(不必亂用太多的舊代碼)是向所有相關表添加兩個新字段, Disabled
和SortOrder
。 “ 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.