【问题标题】:SQL Server order by different valuesSQL Server 按不同值排序
【发布时间】:2011-07-31 11:09:48
【问题描述】:

我有一张表,其中status 可以是GOLDSILVERACTIVEINACTIVE

我想按那个顺序排序...并取前 X。我怎样才能在我的查询中写出来?

目前我正在填写一个列表,首先查询GOLD,然后检查列表的大小,然后查询SILVER,然后再次检查大小等。

【问题讨论】:

    标签: sql-server sql-order-by


    【解决方案1】:
    SELECT TOP X *
    FROM myTable
    ORDER BY
      CASE
           WHEN Status = 'GOLD' THEN 4
           WHEN Status = 'SILVER' THEN 3
           WHEN Status = 'ACTIVE'  THEN 2
           WHEN Status = 'INACTIVE' THEN 1
      END DESC
    

    【讨论】:

    • +1 效果很好 - 另一种选择是为可能的状态值创建一个单独的查找表,并在该查找表中定义一个排序序列
    • @marc_s:绝对。我几乎提到了这一点,但不想“搅浑水”
    • 我喜欢这种快速简便的解决方案。非常感谢:)
    【解决方案2】:

    如果你做得很好,你真的应该把它规范化到一个单独的表中:

    statusvalues
    id   displaytext sortorder
    1    GOLD        10
    2    SILVER      20
    3    ACTIVE      30
    4    INACTIVE    40
    

    然后将 id 作为您的状态值存储在主表上。从您的主表连接到此表,以获取显示文本和排序顺序,并进行适当的排序。

    NB 1 我在排序顺序中留下了空隙,所以如果你必须插入另一个,你可以把它放在例如15 无需更改任何其他值。 NB 2 这意味着,如果您的客户决定“GOLD”现在应显示为“PREMIUM”,则您更改 1 个数据项值,并且您的代码保持不变。可能会为您节省很多时间...! 但这可能是矫枉过正 - 由您来评估。

    【讨论】:

    • +1。这是实施灵活排序的更通用方式。
    • 不要将 id 列设为四字节 int,将其设为单字节 tinyint 或将其称为 WidgetStatusCode 并将其设为 char(1)。
    • 我不会把它变成字符;如果你把它变成数字,那么你可以做一些有用的事情,比如“如果 WidgetStatus
    【解决方案3】:

    这可能对某人有所帮助。假设您有一个表(MyTable),其中有一列(StatusTypeID)作为“StatusTypes”表的外键。您可以像这样实现一个过程来进行动态排序。

    CREATE PROCEDURE DynamicSort(@SortOrder int)   
    AS
    BEGIN
    
    SELECT * FROM MyTable
    ORDER BY
    CASE WHEN StatusTypeID = @SortOrder then 1
    END 
    
    DESC
    
    END
    --  exec  DynamicSort 7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多