PostgreSQL命令WHERE“表”。“列”IN查询

时间:2013-04-23 23:09:41

标签: sql postgresql sql-order-by

在PostgreSQL中,是否进行此查询

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

总是以1, 5, 3顺序返回结果还是含糊不清? 如果它不明确,我如何正确地确保结果符合1, 5, 3的顺序?

5 个答案:

答案 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;

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

-> SQLfiddle

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

或者关于dba.SE的相应问题:
How to preserve the original order of elements in an unnested array?