我有以下查询
SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27)
我的结果是:
invoice_id | invoice_number | ...
------------------------------------
9 | 201006003 |
13 | 201006020 |
15 | 201006022 |
27 | 201006035 |
这是我想要的结果集,除了由invoice_id(这是一个自动增量值)排序。
现在我希望结果按照我在查询中指定的顺序(13,15,...)。有办法实现吗?
背景是我有一个绑定到DataGridView的DataTable。用户可以对结果进行过滤和排序,但如果他想要打印结果,我不会使用DataTable进行打印,因为它只包含最重要的列,而是从数据库中提取整个记录并将其传递给我的打印控件
我还尝试使用缺少的结果扩展现有的DataTable,但这似乎比使用IN(...)查询要慢。
答案 0 :(得分:3)
这很难看,但你可以做到:
ORDER BY CASE invoice_id WHEN 13 THEN 0 WHEN 15 THEN 1 WHEN 9 THEN 2 WHEN 27 THEN 3 ELSE 4 END
实际上,有FIELD函数:
ORDER BY FIELD(invoice_id, 13, 15, 9, 27)
FIELD function返回其余列表中第一个参数的位置。
或者,如果你动态生成它,你可以这样做:
WHERE invoice_id IN ({list}) ORDER BY FIND_IN_SET(invoice_id, '{list}')
答案 1 :(得分:3)
您希望FIELD
按参数排序。
SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27) ORDER BY FIELD (invoice_id, 13, 15, 9, 27)