在PostgreSQL中,是否进行此查询
SELECT "table".* FROM "table" WHERE "table"."column" IN (1, 5, 3)
总是以1, 5, 3
顺序返回结果还是含糊不清?
如果它不明确,我如何正确地确保结果符合1, 5, 3
的顺序?
答案 0 :(得分:3)
WHERE子句不会以任何方式对结果进行排序,它只会选择匹配的记录,无论数据库索引找到它们的顺序如何。
您必须添加order by子句。
答案 1 :(得分:2)
真假前的错误订单
SELECT "table".*
FROM "table"
WHERE "table"."column" IN (1, 5, 3)
order by
"column" != 1,
"column" != 5,
"column" != 3
答案 2 :(得分:2)
在您的选择语句中添加以下内容
order by CASE WHEN "column"=1 THEN 1
WHEN "column"=2 THEN 2
ELSE 3
END
如果您有多于三个值,那么在您查询中创建查找表并加入其中可能会更容易
答案 3 :(得分:1)
在select语句中使用“IN”时,Postgre只会根据该值范围返回匹配的行。它在任何方面都不含糊,但如果您需要订购结果,则需要明确添加ORDER BY“column1,column2 ......”
答案 4 :(得分:1)
set 本身知道无订单。 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的相应问题:
How to preserve the original order of elements in an unnested array?