在 PostgreSQL 中,是否执行此查询
SELECT "table".* FROM "table" WHERE "table"."column" IN (1, 5, 3)
总是按1, 5, 3
顺序返回结果还是模棱两可?
如果它是模棱两可的,我如何正确地确保结果是有序的1, 5, 3
?
在 PostgreSQL 中,是否执行此查询
SELECT "table".* FROM "table" WHERE "table"."column" IN (1, 5, 3)
总是按1, 5, 3
顺序返回结果还是模棱两可?
如果它是模棱两可的,我如何正确地确保结果是有序的1, 5, 3
?
WHERE 子句不会以任何方式对结果进行排序,它只会选择匹配的记录,无论数据库索引以何种顺序找到它们。
您必须添加一个 order by 子句。
真实前的虚假订单
SELECT "table".*
FROM "table"
WHERE "table"."column" IN (1, 5, 3)
order by
"column" != 1,
"column" != 5,
"column" != 3
在您的选择语句中添加如下内容
order by CASE WHEN "column"=1 THEN 1
WHEN "column"=2 THEN 2
ELSE 3
END
如果您有三个以上的值,则创建查找表并在查询中加入该表可能会更容易
当您在 select 语句中使用“IN”时,Postgre 只返回针对该值范围的匹配行。这绝不是模棱两可的,但是如果您需要对结果进行排序,则需要显式添加 ORDER BY "column1,column2..."
一个集合本身没有顺序。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;
返回在输入数组的序列中找到的所有行:
有关更多详细信息和面向未来的代码,请考虑这个密切相关的问题:
PostgreSQL unnest() with element number
或 dba.SE 上的相应问题:
如何保留未嵌套数组中元素的原始顺序?