Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不带排序的sql选择_Sql_Sorting - Fatal编程技术网

不带排序的sql选择

不带排序的sql选择,sql,sorting,Sql,Sorting,我想这是一个长期的尝试,但是,有没有一种方法可以列出sql查询而不进行排序 我有 select * from items where manufacID = 2 or manufacID = 1 or manufacID = 4 我不想把它们列在asc或decs顺序中,但当我输入时。。。所以2,1,4 那么,我可以这样做吗?是的,使用这个: SELECT * FROM items WHERE manufacID IN (2, 1, 4) ORDER BY (manufacID = 2) A

我想这是一个长期的尝试,但是,有没有一种方法可以列出sql查询而不进行排序

我有

select * from items 
where manufacID = 2 
or manufacID = 1
or manufacID = 4
我不想把它们列在asc或decs顺序中,但当我输入时。。。所以2,1,4

那么,我可以这样做吗?

是的,使用这个:

SELECT * FROM items
WHERE manufacID IN (2, 1, 4)
ORDER BY (manufacID = 2) ASC,
         (manufacID = 1) ASC,
         (manufacID = 4) ASC
结果按条件匹配的顺序排序。将ASC更改为DESC以颠倒顺序。这仅适用于允许排序子句中包含条件的数据库


(旁注:为什么要这样做?

您可以在“选择”列中添加一个额外的列作为排序列,然后按该列排序:

SELECT 
  *,
  CASE manufacID
    WHEN 2 THEN 1
    WHEN 1 THEN 2
    WHEN 4 THEN 3
  END AS sortOrder
FROM
  items
ORDER BY
  sortOrder

由于您没有指定排序,记录将按自然顺序排序,这取决于您使用的RDBMS。例如,在SQL Server中,顺序是未定义的

您可以通过以下值创建要排序的值:

select * from items 
where manufacID in (2, 1, 4)
order by case manufacID
  when 2 then 1
  when 1 then 2
  when 4 then 3
end

酷!你真的需要ASC吗?这是默认模式,我记得。这依赖于在false之前的true排序。我不确定SQL对此是否有标准。在Postgres中,false在true之前排序,这意味着您给出的示例将与所需的顺序相反。您可以通过将sort更改为desc来解决此问题,但这很神秘。我曾经这样做过,并在上面加了一条注释来解释,但从那以后,我转而使用case/when,因为它更具可读性和可维护性。现在我想,ASC是多余的,因为它只会改变真假排序顺序,而不会改变最终列表的顺序。关于真假排序顺序的观点很好——这在一些数据库中是未定义的,因此应该限制在单个引擎上。我以前没有见过Thomas O的答案,但如果它有效,它看起来是一个更简洁的解决方案。去拿那个!实际上,这意味着您确实希望对结果进行排序。否则,大多数数据库引擎只会返回与您的条件相匹配的任何记录,不管它们遇到的顺序如何。在使用UNION ALL时,不必进行排序?有趣的是,看看哪个更快,UNION或order by解决方案。UNION是一个相对缓慢的操作。虽然这样做有效,但使用案例几乎总是更快。此外,虽然在本例中,查询的其余部分相当简单,但如果您有一个复杂的查询,整个复杂查询必须重复3次。稍后阅读的人必须弄清楚整个复杂的事情是相同的,还是存在差异。如果有人做出改变,他们必须做出3次相同的改变。如果他们犯了一个错误,只改变两个位置或错误地键入三个位置中的一个,你可能会得到微妙的错误。我会避免这样。
SELECT * FROM
(
select 1 as sort, * from items 
where manufacID = 2 

union all

select 2 as sort, * from items 
where manufacID = 1

union all

select 3 as sort, * from items 
where manufacID = 4
)
order by sort
select * from items where manufacID = 2 
union all
select * from items where manufacID = 1
union all
select * from items where manufacID = 4