【问题标题】:Conditional ordering in SQL ServerSQL Server 中的条件排序
【发布时间】:2016-02-05 23:40:13
【问题描述】:

T:

ID | Name | Days

ID是PK。

我确实想select * from T, order by ID descending,但在顶部是那些在10001004 之间有ID 的条目

select *
from T
order by Id descending // something like a *case*?

1004 - 1st / 1003 2nd / 1002 3rd / 1001 4th / 1000 5nd ... 然后 6th 应该是最大 Id,在这之后,除了我们已经在 TOP 上显示的 1000 - 1004 之间的 Id 之外,所有的都是降序的。

我也想知道 linq 语句。

【问题讨论】:

    标签: sql-server


    【解决方案1】:
    SELECT *
    FROM (VALUES (998), (999), (1000), (1001), (1002), (1003), (1004)) AS T(ID)
    ORDER BY CASE
            WHEN T.ID BETWEEN 1000 AND 1004 THEN 1
            ELSE 2
        END
        , ID DESC;
    

    Sick的回答中获取样本数据。

    这是如何工作的?

    1. 它会检查您的 ID 是否符合您的条件并为其分配一个 值为 1
    2. 其他一切都会有 2
    3. 它将首先按此值排序
    4. 您的符合条件的 ID 将始终排在第一位
    5. 然后我们按 ID 以 DESC 顺序对剩菜进行排序

    输出:

    ╔══════╗
    ║  ID  ║
    ╠══════╣
    ║ 1004 ║
    ║ 1003 ║
    ║ 1002 ║
    ║ 1001 ║
    ║ 1000 ║
    ║  999 ║
    ║  998 ║
    ╚══════╝
    

    我做了另外一个例子,它在我们的数据库中生成了 676.800 行:

    ;WITH TestTable (ID)
    AS (
        SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM sys.objects
        CROSS JOIN sys.schemas
        )
    SELECT *
    FROM TestTable AS T
    ORDER BY CASE
            WHEN T.ID BETWEEN 1000 AND 1004 THEN 1
            ELSE 2
        END
        , ID DESC;
    

    这是它的结果:

    ╔════════╗
    ║  ID    ║
    ╠════════╣
    ║ 1004   ║
    ║ 1003   ║
    ║ 1002   ║
    ║ 1001   ║
    ║ 1000   ║
    ║ 676800 ║
    ║ 676799 ║
    ║ 676798 ║
    ║ 676797 ║
    ║ 676796 ║
    ║ 676795 ║
    ║ ...    ║
    ║ 1006   ║
    ║ 1005   ║
    ║ 999    ║
    ║ 998    ║
    ║ ...    ║
    ║ 1      ║
    ╚════════╝
    

    【讨论】:

    • 如果我的表有 20k 个条目怎么办?您给出了一个包含 7 个条目的特定固定示例。
    • 我可以看到没有区别。如果您的 ID 符合以下条件:WHEN T.ID BETWEEN 1000 AND 1004 THEN 1,则它们在此查询中将始终排在第一位。
    • 你是对的,我的错,对不起。感谢您的信息
    • @FlorinM。我用更好的例子更新了我的答案。
    【解决方案2】:

    试试这个

    select *
    from T
    order by case when ID between 1000 and 1004 then -100000 else id end,ID desc
    

    这里-100000是随机低值

    例子:

    SELECT *
    FROM   (VALUES (998),
                   (999),
                   (1000),
                   (1001),
                   (1002),
                   (1003),
                   (1004) ) tc (id)
    ORDER  BY CASE
                WHEN ID BETWEEN 1000 AND 1004 THEN -100000
                ELSE id
              END,
              ID DESC 
    

    【讨论】:

      【解决方案3】:
      SELECT column_name, column_name
      FROM table_name
      ORDER BY column_name ASC|DESC, column_name ASC|DESC;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-25
        相关资源
        最近更新 更多