2

如果我有这样的查询

$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 的顺序,但我已经超出了我的深度。

谢谢你的帮助!

4

3 回答 3

4

带有案例陈述

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

编辑:这是一个通用的 SQL 解决方案,但如果您的平台支持它,Frank Heikens 的 GREATEST 答案会更简洁。

于 2012-07-19T10:14:14.863 回答
3

使用GREATEST()

ORDER BY
  GREATEST(l.start, l.stop)
于 2012-07-19T10:42:54.800 回答
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
于 2012-07-19T10:17:13.160 回答