SQL选择给定订单中的行

时间:2014-08-09 15:17:49

标签: sql select

我有一张表,希望从中选择行, 我希望能够定义结果的定义顺序。

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 ....

我猜这不可能吗?

4 个答案:

答案 0 :(得分:2)

您可以在MySQL中使用field()函数:

order by field(id, 3, 5, 8, 9, 3, 5) 

当然,35匹配第一次,而不是第二次,所以它们是多余的。

您可以在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具有基于集合的功能,但我又不知道您正在使用什么。