SQL按给定顺序选择行

SQL按给定顺序选择行,sql,select,Sql,Select,我有一个表,我想从中选择行, 我希望能够定义结果的定义顺序 SELECT * FROM Table ORDER BY (CSV of Primary key) 例如: 想要的结果 ID | * | ----------- 3 .... 4 .... 等 我猜这是不可能的 如果我正确理解了你的问题,你可以这样做: Select * from table order by CASE id WHEN 3 THEN 1 WHEN 5 THEN 2 WHEN 8 THEN 3 WHEN 9

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

SELECT * 
FROM Table 
ORDER BY (CSV of Primary key) 
例如:

想要的结果

ID | * |
-----------
3 ....
4 ....


我猜这是不可能的

如果我正确理解了你的问题,你可以这样做:

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
您可以在MySQL中使用field函数:

order by field(id, 3, 5, 8, 9, 3, 5) 
当然,3和5是第一次匹配,而不是第二次,所以它们是多余的

您可以在SQL Server中使用类似的函数choose。或者,任何数据库中的用例:

order by (case when id = 3 then 1
               when id = 5 then 2
               when id = 8 then 3
               when id = 9 then 4
          end);

尝试在ORDERBY子句中使用大小写表达式 从某物中选择*

订购人 案例
当“this”然后为一个简短的值列表设置1时,可以生成一个CASE语句,对选项进行优先级排序。例如,要按id按顺序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
这显然不能很好地扩展较长的列表,在您的示例中,您有重复的项目,不确定这是否是故意的,这需要您在序列中的不同点上选择同一行两次

一个更复杂的解决方案是创建一个包含id、序列和位置对的表,并将其连接到查询的其余部分。正常的内部联接也会按这些行进行过滤;如果这不是我们想要的,那么可以使用LEFT JOIN和coalescequence\u position、$num\u items+1来给出与CASE版本中的ELSE子句相同的结果

您没有提到正在运行的DBMS MySQL、Postgres等和版本,因此我无法确切说明您的选项是什么,但它们包括临时表、包含语句或子查询的CTE,这些语句或子查询涉及VALUES子句或UNION ALL语句


请注意,在这里您可能会看到动态生成SQL,而不仅仅是直接使用逗号分隔的字符串。您可以创建一个自定义函数来直接生成该SQL,或者甚至您的DBMS具有基于集合的函数来提供帮助,但我也不知道您使用的是什么。

为什么示例输出中会有4个?在请求SQL帮助时,请始终提及您使用的DBMS MySQL、Postgres等和版本,因为特征差异很大。如果您正在寻找一个便携式解决方案,它不一定与符合标准的解决方案相同,那么请明确提及。谢谢,我可以确认我可以按fieldid排序,$string,其中字符串将包含CSV。谢谢again@RossW . . . 不。如果您使用的是MySQL,那么在这种情况下,您将使用find_in_set。
ORDER BY CASE id
    WHEN 3 THEN 0
    WHEN 5 THEN 1
    WHEN 8 THEN 2
    WHEN 9 THEN 3
    ELSE 4
END ASC