我有一张表,希望从中选择行, 我希望能够定义结果的定义顺序。
SELECT *
FROM Table
ORDER BY (CSV of Primary key)
EG:
Select *
from table
order by id (3,5,8,9,3,5)
通缉结果
ID | * |
-----------
3 ....
4 ....
等
我猜这不可能吗?
答案 0 :(得分:2)
您可以在MySQL中使用field()
函数:
order by field(id, 3, 5, 8, 9, 3, 5)
当然,3
和5
匹配第一次,而不是第二次,所以它们是多余的。
您可以在SQL Server中使用类似的函数choose()
。或者,在任何数据库中使用case
:
order by (case when id = 3 then 1
when id = 5 then 2
when id = 8 then 3
when id = 9 then 4
end);
答案 1 :(得分:0)
如果我能正确理解你的问题,你可以这样做:
Select *
from table
order by CASE id WHEN 3 THEN 1 WHEN 5 THEN 2 WHEN 8 THEN 3 WHEN 9 THEN 4 WHEN 3 THEN 5 WHEN 5 THEN 6 ELSE 10000 END
答案 2 :(得分:0)
尝试在ORDER BY子句中使用CASE表达式 SELECT * FROM something
ORDER BY CASE #something 当'这'那么1
答案 3 :(得分:0)
对于一个简短的值列表,可以生成一个优先选项的CASE语句。例如,按顺序按顺序排序(3,5,8,9):
ORDER BY CASE id
WHEN 3 THEN 0
WHEN 5 THEN 1
WHEN 8 THEN 2
WHEN 9 THEN 3
ELSE 4
END ASC
对于较长的列表,这显然不能很好地扩展,并且在您的示例中,您有重复的项目(不确定是否是故意的),这要求您在序列的不同点中选择相同的行两次。 / p>
更复杂的解决方案是创建一个(id,sequence_position)对的表,并将其连接到查询的其余部分。正常的INNER JOIN也会按这些行进行过滤;如果那不是想要的东西,你可以使用LEFT JOIN和COALESCE(sequence_position,$ num_items + 1)来提供CASE版本中的ELSE子句。
你没有提到你正在运行的DBMS(MySQL,Postgres等)和版本,所以我无法准确地说出你的选择,但它们包括临时性的东西表和CTE(WITH语句)或涉及VALUES子句或UNION ALL语句的子查询。
请注意,您可能会考虑在这里动态生成SQL,而不仅仅是直接使用逗号分隔的字符串。您可以创建一个自定义函数来直接生成SQL,甚至可以让您的DBMS具有基于集合的功能,但我又不知道您正在使用什么。