【问题标题】:Order by condition in T-SQL在 T-SQL 中按条件排序
【发布时间】:2019-06-24 15:00:09
【问题描述】:

我有两个结果列。 一个是用户名,另一个是日期时间,可以检查每个用户查看帖子的时间。如果用户还没有看到帖子,则日期时间值为 NULL。

我想订购这样的数据。 date-time 为 null 或 not null 都按用户名字母顺序排列。 但是空数据和非空数据应该分开。

SELECT u.username AS username,
       MAX(w1.date) AS lastdate
FROM w1
     RIGHT OUTER JOIN user_info u ON w1.userid = u.userid
WHERE u.usergroup = 'student'
GROUP BY username
ORDER BY lastdate,
         username;

当我运行这个查询时,我能得到的结果是 当日期时间为 NULL 时,用户名按字母顺序排序, 但是当日期时间不为空时,它是按日期时间排序的。

希望大家能理解,如果不够清楚请留言。

【问题讨论】:

  • 我不确定我是否理解您的要求。对于您的订单,它将首先将具有NULL 值的行放入lastdate (因为NULL 被视为具有“最低”值),然后它将按日期顺序对行进行排序,最低的在前。如果 2 行具有相同的日期,则将按 username 排序。
  • DISTINCT 在该查询中几乎是多余的..

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


【解决方案1】:

你可以使用

order by case when lastdate is null then 0 
              else 1 end, username

【讨论】:

  • 或更短:order by iif(lastDate is null, 0, 1), username
  • @ZoharPeled 甚至更短的 left(LastDate,0),username 在这种情况下,left(...,0) 将返回 null 或空字符串。
  • 如果 SQL Server 可以在 @JohnCappelletti 上使用索引,我相信 SQL Server 有一些优化器重写案例可以转换 LEFT() 使用的某些案例
【解决方案2】:

我建议使用 left join 并将查询表述为:

SELECT u.username AS username,
       MAX(w1.date) AS lastdate
FROM user_info u LEFT JOIN
     w1
     ON w1.userid = u.userid
WHERE u.usergroup = 'student'
GROUP BY u.username
ORDER BY (CASE WHEN w1.date IS NULL THEN 1 ELSE 0 END),
         u.username;

SELECT DISTINCT 几乎从不适合GROUP BY

我还建议在引用多个表的查询中限定所有列引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2015-05-20
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多