[英]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_flag
为0
, ((not paid_flag) - paid_flag)
返回1
所以排序是升序的。
当paid_flag
为1
, ((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.