【问题标题】:Nested order by in sql serversql server中的嵌套顺序
【发布时间】:2015-08-18 03:37:53
【问题描述】:

能否请您帮助我了解以下链接中提到的 mysql 对应的 SQL 服务器解决方案:

SQL nested order by?

SELECT *
FROM categories
ORDER BY IF(parent_id, parent_id, category_id), parent_id, display_order

【问题讨论】:

  • 我已包含查询。随意回滚。
  • 谷歌:Case when statement
  • 谢谢菲利克斯。 @FutbolFan 我在谷歌上搜索了很多关于这个主题的内容,但他们都只是讨论案例和条件。但是在我的问题中的链接中,没有任何案例和条件。只需使用语句“ORDER BY IF(parent_id, parent_id, category_id), parent_id, display_order”,所有记录都按指定的分组列进行嵌套排序。我不想选择一个列进行排序我希望所有的分组列都被嵌套排序。我在链接中测试了解决方案,没问题,但我不能在 SQL Server 中这样做。
  • 这里很好地解释了IF声明:mysqltutorial.org/mysql-if-function.aspx

标签: sql sql-server sorting sql-order-by


【解决方案1】:

MySQL IF(a, b, c) 函数表示如果a 为非空且非零则返回b,否则返回c

对于IF(a, a, b),它实际上意味着如果非空且非零则返回a,否则返回b。由于您只使用非空检查,COALESCE(a, b) 也是这样做的,大多数 DBMS 都支持COALESCE,包括 SQL Server。

因此,这应该适用于 MySQL 和 SQL Server:

SELECT *
FROM categories
ORDER BY COALESCE(parent_id, category_id) -- sort parents and children together
       , COALESCE(parent_id, 0) -- sort parent before children
       , display_order -- sorts children among themselves

更新: 上面假设了一个具有外键的良好数据模型,而不是具有0 值表示“无父”的数据模型。

由于COALESCE 只检查空值,您需要使用CASE 语法。这也适用于大多数 DBMS。

SELECT *
FROM categories
ORDER BY CASE WHEN parent_id <> 0 THEN parent_id ELSE category_id END
       , parent_id
       , display_order

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多