在sql server中嵌套的顺序

时间:2015-08-18 03:37:54

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

请您帮我解决下面链接中提到的mysql的对应SQL服务器解决方案:

SQL nested order by?

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

1 个答案:

答案 0 :(得分:0)

如果IF(a, b, c)非空且非零,则MySQL b函数表示返回a,否则返回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值的数据模型,表明&#34;没有父&#34;。

由于COALESCE仅检查null,因此您需要使用CASE语法。这也适用于大多数DBMS。

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