繁体   English   中英

根据真/假标志对日期进行不同排序

[英]Sorting dates differently based on true/false flag

我正在尝试根据付费标志是真还是假对日期列进行排序。 如果付费标志为假(未付费),我希望最老的先出现。 如果付费标志为真,我希望最新的先出现。

当前查询:

SELECT due_date, date_paid, 
    IF(i.date_paid IS NULL, 0, 1) AS paid_flag 
FROM tc_vendorInvoices 
ORDER BY paid_flag, 
        CASE WHEN paid_flag = 0 THEN due_date END ASC, 
        CASE WHEN paid_flag = 0 THEN due_date END DESC 
LIMIT 0, 50

这仅对付费标志进行排序,截止日期为 ASC:

due_date   |    date_paid     |  paid_flag
2020-09-28          NULL             0
2020-09-29          NULL             0
2020-10-01          NULL             0
2020-09-14      2020-09-14           1 
2020-09-29      2020-09-29           1
2020-10-05      2020-10-05           1

它需要这样排序:

due_date   |    date_paid     |  paid_flag
2020-09-28          NULL              0
2020-09-29          NULL              0
2020-10-01          NULL              0
2020-10-05      2020-10-05            1
2020-09-29      2020-09-29            1
2020-09-14      2020-09-14            1

使用布尔标志paid_flag和函数to_seconds()可以做到:

order by paid_flag,
         ((not paid_flag) - paid_flag) * to_seconds(due_date)

paid_flag0((not paid_flag) - paid_flag)返回1所以排序是升序的。
paid_flag1((not paid_flag) - paid_flag)返回-1所以排序是由-to_seconds(due_date)降序完成的。

请参阅演示
结果:

> due_date   | date_paid  | paid_flag
> :----------| :--------- | --------:
> 2020-09-28 | null       |         0
> 2020-09-29 | null       |         0
> 2020-10-01 | null       |         0
> 2020-10-05 | 2020-10-05 |         1
> 2020-09-29 | 2020-09-29 |         1
> 2020-09-14 | 2020-09-14 |         1

我们不能在表达式中移动 ASC 或 DESC,它是 ORDER BY 子句的一部分。 所以像这样的构造是可以的:

ORDER  
   BY fee
    , fi    DESC
    , fo    ASC

我们可以使用表达式有条件地返回一个值,然后对该表达式进行排序。 诀窍是为我们不想排序的行返回一个固定值。

像这样的东西:

ORDER BY paid_flag
       , CASE paid_flag WHEN 0 THEN due_date ELSE NULL     END  ASC
       , CASE paid_flag WHEN 0 THEN NULL     ELSE due_date END  DESC 

还有其他方法; 这恰好与原始尝试的方法非常相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM