2

在 PostgreSQL 中,是否执行此查询

SELECT "table".* FROM "table" WHERE "table"."column" IN (1, 5, 3)

总是按1, 5, 3顺序返回结果还是模棱两可?
如果它是模棱两可的,我如何正确地确保结果是有序的1, 5, 3

4

5 回答 5

3

WHERE 子句不会以任何方式对结果进行排序,它只会选择匹配的记录,无论数据库索引以何种顺序找到它们。

您必须添加一个 order by 子句。

于 2013-04-23T23:12:41.573 回答
2

真实前的虚假订单

SELECT "table".*
FROM "table"
WHERE "table"."column" IN (1, 5, 3)
order by
    "column" != 1,
    "column" != 5,
    "column" != 3
于 2013-04-23T23:19:17.123 回答
2

在您的选择语句中添加如下内容

order by CASE WHEN "column"=1 THEN 1
              WHEN "column"=2 THEN 2
              ELSE 3
       END

如果您有三个以上的值,则创建查找表并在查询中加入该表可能会更容易

于 2013-04-23T23:19:39.583 回答
1

当您在 select 语句中使用“IN”时,Postgre 只返回针对该值范围的匹配行。这绝不是模棱两可的,但是如果您需要对结果进行排序,则需要显式添加 ORDER BY "column1,column2..."

于 2013-04-23T23:23:09.903 回答
1

一个集合本身没有顺序SELECT查询需要返回ORDER BY有序行。

其他答案在您的 中建议CASE了语句或布尔表达式,但是对于大表ORDER BY来说,这远非优雅且效率低下。我建议为您的查询使用数组逗号分隔的字符串而不是集合。

对于给定的表:

CREATE TABLE tbl (col int);

使用数组它可以像这样工作:

SELECT col
FROM   tbl
JOIN  (
   SELECT col, row_number() OVER () AS rn
   FROM   unnest('{1,5,3}'::int[]) AS col
   ) u USING (col)
ORDER  BY rn;

返回在输入数组的序列中找到的所有行:

-> SQL小提琴

有关更多详细信息和面向未来的代码,请考虑这个密切相关的问题:
PostgreSQL unnest() with element number

或 dba.SE 上的相应问题:
如何保留未嵌套数组中元素的原始顺序?

于 2013-04-23T23:40:52.193 回答