根据另一个字段的字母顺序设置排序顺序字段

时间:2010-12-02 10:46:03

标签: sql sql-server sql-server-2005

我最近在我的数据库(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]的字母顺序作为默认排序顺序?

更新
问题已经得到解答,但有些人已经指出这个解决方案可能并不理想,所以我只想为将来的参考添加一些上下文。这是一个旧系统(不是传统的旧系统,但已经存在了很多年),使用了一些不同的地方。

应用程序中有多个列表/下拉列表,其中包含典型的“状态”类型(例如发票状态订单状态客户类型< / em>等)。回到首次编写系统时,这些是每个地方都在使用的标准值(不打算以任何方式进行更改),但是有些用户已经开始请求添加新状态,删除不再使用的状态并指定自定义排序顺序(一个状态可能更频繁使用,因此很高兴将它放在列表的顶部)。

我发现执行此操作的最简单方法(无需使用太多旧代码)是向所有相关表添加两个新字段DisabledSortOrderDisabled字段用于“隐藏”未使用的类型(由于引用完整性而无法删除它们,并且还需要保留它们保存的值),SortOrder字段就是这样的用户可以指定自己的自定义排序顺序。由于所有相关表也共享这两个相同的列,因此很容易创建一个简单的接口来以通用方式处理排序(和禁用)。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

你应该问问自己这个方案是否是解决问题的最佳方案。这样的实现不能很好地扩展。

答案 2 :(得分:1)

您选择实现表排序的方式很不寻常,显然仅限于按整数排序。

我真的建议您以另一种方式重新设计排序子系统。

例如,在某个地方有一个元数据表,其中包含用户想要排序的列的名称,然后在相关查询上使用ORDER BY (columnname)

编辑:哦等等,我们正在讨论查找表并让用户更改订单。现在我已经清楚了解你的实现对我来说更有意义。