根据最近的一个或另一个字段排序

时间:2012-07-19 10:10:52

标签: php sql postgresql

如果我有这样的查询

$line_item_status_query = 
"SELECT p.description, 
       p.production_order_id, 
       l.start_user, 
       p.sequence, 
       l.start :: date, 
       l.stop :: date, 
       pr.id, 
       pr.process, 
       pr.process_sequence, 
       pr.caption_in_process, 
       pr.caption_closed, 
       pr.show_to_customer 
FROM   production_order_processes p 
       LEFT JOIN production_order_process_log l 
              ON l.production_order_process_id = p.id 
       LEFT JOIN processes pr 
              ON pr.process_sequence = p.sequence 
WHERE  l.production_order_id = (SELECT id 
                                FROM   production_orders 
                                WHERE 
       sales_order_line_id = '".$sales_order_line_id."') 
ORDER  BY p.sequence";

l.start :: date和/或l.stop :: date可能为空或空,我如何执行ORDER BY以便我可以将返回的结果以升序(或降序)为基础哪个日期更近?

我想用p.sequence用一些条件逻辑替换顺序,但我不在我的深处。

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

使用案例陈述

 ORDER BY 
    CASE 
    WHEN l.start>l.stop THEN l.start 
    ELSE COALESCE(l.stop, l.start) 
    END 

编辑:这是一个通用的SQL解决方案,但如果您的平台支持它,那么Frank Heikens的“最好的答案”就是整洁。

答案 1 :(得分:3)

使用GREATEST()

ORDER BY
  GREATEST(l.start, l.stop)

答案 2 :(得分:0)

我不确定我是否理解您的短语基于最近的日期。但是,您可以按顺序使用case

ORDER BY (case when l.start is null and l.stop is null then null
               when l.start is null then l.stop
               when l.stop is null then l.start
               when l.start > l.stop then l.start
               else l.stop
          end)

这将用于排序:

  • l.start如果l.stop为空
  • l.stop如果l.start为空
  • 最近的l.stopl.start如果两者都不是null
  • null如果两者都是null