【问题标题】:SQL Server Sorting Int Column bugSQL Server 排序 Int 列错误
【发布时间】:2017-09-11 09:58:29
【问题描述】:

我有这个 SQL 语句,它根据 change_orderchange_id 对行进行排序。

我的陈述如下:

select * 
from change_dtl_from2 
where chnfr_hdrno = 'CH000009' 
order by 
    case 
       when chnorder is null 
          then 1 
          else 0 
    end asc, change_id asc

chnfr_hdrno 是文档编号,chnorderchange_orderchange_id 是每行的唯一键。

如果我执行那个语句,结果会是这样的:

如您所见,chnorder 值为 5 的行位于最顶部,其中 chnorder 设置其顺序升序。我不知道我在哪里或做错了什么。

chnorder 的默认值为 null 并且是 int 列。这就是为什么我很困惑,因为每当我添加新行时,新行都会在最上面。我希望你们都可以帮助我。 :)

【问题讨论】:

  • 升序排序时,0 在 1 之前。不清楚您希望看到什么。对于您显示的所有行,chnorder 已设置,因此它们都将按 0 排序,后跟 change_id 中的值。
  • 您当前的输出是正确且符合预期的。
  • 由于您的样本数据中chnorder 的所有值都是NOT NULL,因此整个数据集按change_id 排序 - 并且它按change_id正确排序 - 那么问题/问题是什么?
  • 您有什么问题或想从上面的示例中了解?在上面的例子中,order by 将是“order by 0 asc, change_id asc”。

标签: sql asp.net sql-server vb.net


【解决方案1】:

SQL 会根据您的查询来做正确的事情。使用您的 CASE 语句,您将所有非 NULL 值“替换”为 1,并仅按 change_id 对它们进行排序。如果你只想用 1 替换 NULL,你应该使用

order by (case when chnorder is null then 1 else chnordner end) asc

或者你应该使用

order by (case when chnorder is null then 1 else 0 end) asc, chnordner  asc, change_id asc

【讨论】:

  • 你先生太棒了!谢谢!
猜你喜欢
  • 2014-08-15
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2016-10-03
相关资源
最近更新 更多