按案例订购以获得此:-1、-2、-3、0、+1、+2、+3
ORDER BY CASE to get this: -1, -2, -3, 0, +1, +2, +3
在我的查询中,我想按以下方式排序:
DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH))
以上语句returns负值和正值。更准确地说,未来日期为负,过去日期为正,当前日期为零。我用它来计算服务的到期日期。您可以在下面找到输出的注释示例:
-1 (expires tomorrow)
-10 (expires in 10 days)
-20 (expires in 20 days)
0 (expires today)
+1 (expired yesterday)
+10 (expired 10 days ago)
+20 (expired 20 days ago)
问题是我想按照您在上面看到的完全相同的方式来 ORDER BY 结果。我正在尝试使用 CAST() 和 ABS() 但没有成功。我认为这是因为没有标准功能来获得我想要的。说我很确定我可以使用 ORDER BY CASE 解决这个问题,如下所示。
在你问之前它是伪代码。我不是假装在我的查询中使用它:
ORDER BY CASE WHEN X <= 0
THEN
ODER BY CASE WHEN X > 0
太糟糕了,我尝试使用的所有内容都遇到了大量语法错误:-) 它是如何工作的?
您应该将 ORDER BY 放在查询的末尾
- SELECT(查询)as "xxx" FROM DUAL
- 案例 xxx
- (案例说明)
- 结束 过期
- 订购方式 过期
您需要在结果中给自己一些额外的列,以获得所需的结果以供 ORDER by。
例如:
SELECT (values you care about),
DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH)) AS number,
ABS(DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH))) AS numberAbs,
CASE WHEN
DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH)) < 0
THEN 0 ELSE 1 END AS filter
ORDER BY filter, numberAbs
这里number
就是你关心的那个。 numberAbs
和 filter
让你首先过滤负值,然后从那里开始计数(所以 -1 在 -10 之前)。
可能可以稍微清理一下,但这应该涵盖如何获得您似乎正在寻找的结果。
http://sqlfiddle.com/#!9/5a0dd/6
SELECT id, DATEDIFF(CURDATE(), DATE_ADD(`date`, INTERVAL cycle MONTH)) idx
FROM test
ORDER BY IF(idx<0,-idx/1000,IF(idx=0,0.1, idx)) ASC
在我的查询中,我想按以下方式排序:
DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH))
以上语句returns负值和正值。更准确地说,未来日期为负,过去日期为正,当前日期为零。我用它来计算服务的到期日期。您可以在下面找到输出的注释示例:
-1 (expires tomorrow)
-10 (expires in 10 days)
-20 (expires in 20 days)
0 (expires today)
+1 (expired yesterday)
+10 (expired 10 days ago)
+20 (expired 20 days ago)
问题是我想按照您在上面看到的完全相同的方式来 ORDER BY 结果。我正在尝试使用 CAST() 和 ABS() 但没有成功。我认为这是因为没有标准功能来获得我想要的。说我很确定我可以使用 ORDER BY CASE 解决这个问题,如下所示。
在你问之前它是伪代码。我不是假装在我的查询中使用它:
ORDER BY CASE WHEN X <= 0
THEN
ODER BY CASE WHEN X > 0
太糟糕了,我尝试使用的所有内容都遇到了大量语法错误:-) 它是如何工作的?
您应该将 ORDER BY 放在查询的末尾
- SELECT(查询)as "xxx" FROM DUAL
- 案例 xxx
- (案例说明)
- 结束 过期
- 订购方式 过期
您需要在结果中给自己一些额外的列,以获得所需的结果以供 ORDER by。
例如:
SELECT (values you care about),
DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH)) AS number,
ABS(DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH))) AS numberAbs,
CASE WHEN
DATEDIFF(CURDATE(), DATE_ADD(date, INTERVAL cycle MONTH)) < 0
THEN 0 ELSE 1 END AS filter
ORDER BY filter, numberAbs
这里number
就是你关心的那个。 numberAbs
和 filter
让你首先过滤负值,然后从那里开始计数(所以 -1 在 -10 之前)。
可能可以稍微清理一下,但这应该涵盖如何获得您似乎正在寻找的结果。
http://sqlfiddle.com/#!9/5a0dd/6
SELECT id, DATEDIFF(CURDATE(), DATE_ADD(`date`, INTERVAL cycle MONTH)) idx
FROM test
ORDER BY IF(idx<0,-idx/1000,IF(idx=0,0.1, idx)) ASC