【问题标题】:Is it possible to put NULL records as last results on a ORDER BY?是否可以将 NULL 记录作为 ORDER BY 的最后结果?
【发布时间】:2012-09-18 13:44:10
【问题描述】:

这是我的 SQL 查询:

SELECT     TOP (200) IDA
FROM         Categories
WHERE     (IDA = 72)
ORDER BY Order

但它会将 Order NULL 的记录放在 Order 为 int 的记录之前。有没有改变这个顺序的策略?将带有NULL 的记录放在结果列表的底部。

【问题讨论】:

  • 不了解 SQL Server,但在 Oracle 中,您可以执行 ORDER BY Order NULLS LAST

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


【解决方案1】:

适用于任何类型:

select top(200) IDA from Categories
order by case when [order] is null then 1 else 0 end, [order]

【讨论】:

  • 如果它是不同的,我还需要在 select 上写它!不太好看,但还好……
  • 你的意思是你想要前 200 名中的不同值吗?您可以添加一个外部查询,例如“从 (#) sub 中选择不同的 IDA”,将我的答案粘贴为内部查询。您的原始示例有“前 200 个 IDA,其中 IDA = 72”,它只有一个不同的值。
  • 似乎也把SELECT DISTINCT case when [order] is null then 1 else 0 end, [order] 工作,你怎么看?
  • 这是允许的,因为您在 order by 子句中选择不同的字段,即停止错误“如果指定了 SELECT DISTINCT,ORDER BY 项目必须出现在选择列表中。”。然而,这是一个完全不同的查询,只是为了清楚。
  • 所以它用case 2次执行订单?一个在 order by,一个在 select distinct?
【解决方案2】:

是的:

SELECT     TOP (200) IDA
FROM         Categories
WHERE     IDA = 72
ORDER BY 
   CASE 
       WHEN [ORDER] IS NULL 
       THEN 0 
       ELSE 1
   END DESC, [Order]

【讨论】:

  • 是的,但这不是你最初拥有的。为什么不说THEN 2 ELSE 1 END,那你就不需要DESC了?
  • @AaronBertrand 是的,我第一次搞砸了。而且我认为它与THEN 2 ELSE 1 END 相同会使它们排在第一位。对不起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多