我正在编写一个小程序,允许教师从题库中创建考试。然后,老师可以按照他/她希望在考试中出现的顺序对问题进行排序。
所以我试图根据记录ID的顺序返回问题列表。
SELECT * FROM ExamQuestion WHERE ElementID = 66
返回如下结果:
2505
2506
2615
2616
2617
如果我然后尝试根据老师使用下面的查询设置的问题顺序对这些结果进行排序…
SELECT * FROM ExamQuestion WHERE ElementID = 66 ORDER BY
CASE
WHEN ID = '2616' THEN '1'
WHEN ID = '2615' THEN '2'
WHEN ID = '2617' THEN '3'
WHEN ID = '2505' THEN '4'
ELSE ID END ASC
我得到以下结果
2616
2615
2506
2617
2505
这几乎是完美的,但我不能弄清楚的是为什么2506在2617之前返回,即使它是显式设置的。
通常在这个查询中,我不会有一个完整的ID列表,它会根据老师想在考试中问什么问题而变化…
我本以为2506应该出现在列表的最后…
任何想法吗?
以下是您的CASE
声明:
CASE
WHEN ID = '2616' THEN '1'
WHEN ID = '2615' THEN '2'
WHEN ID = '2617' THEN '3'
WHEN ID = '2505' THEN '4'
ELSE ID END ASC
值'2506'
属于ELSE
条件,将按ID
值本身排序。在此例中,取值为'2506'
,介于字符串'2'
和'3'
之间。
这是你的结果集旁边,我列出了实际用于排序结果的值:
+------+------------+
| ID | Sort Value |
+------+------------+
| 2616 | '1' |
| 2615 | '2' |
| 2506 | '2506' | <-- '2506' is in between '2' and '3'
| 2617 | '3' |
| 2505 | '4' |
+------+------------+
谢谢大家-你们都是正确的…排序确实是作为字符串完成的。如果我将CASE语句的THEN部分转换为数字(删除数字周围的引号),那么它就会像我期望的那样工作
SELECT * FROM MightyMindsExamQuestion WHERE IFElementID = 66 ORDER BY
CASE
WHEN ID = '2616' THEN 1
WHEN ID = '2615' THEN 2
WHEN ID = '2617' THEN 3
WHEN ID = '2505' THEN 4
ELSE ID END ASC
结果2616
2615
2617
2505
2506