93 votes

Rownum dans postgresql

Existe-t-il un moyen de simuler le rownum dans postgresql ?

107voto

iddqd Points 3047

Postgresql > 8.4

SELECT 
    row_number() OVER (ORDER BY col1) AS i, 
    e.col1, 
    e.col2, 
    ... 
FROM ...

17 votes

Soyez prudent. C'est similaire au rownum d'Oracle, mais c'est légèrement différent. Le rownum d'Oracle est assigné au moment de la lecture de la ligne sur le disque, alors que ce row_number() est assigné en fonction de ce qui se trouve dans votre OVER.

0 votes

Qu'en est-il des différences de vitesse ?

39voto

Buka Points 261

Postgresql a une limite.

Le code d'Oracle :

select *
from
  tbl
where rownum <= 1000;

même dans le code de Postgresql :

select *
from
  tbl
limit 1000

1 votes

Je préférerais la syntaxe ANSI SQL:2008 : FETCH N ROWS ONLY (fonctionne sur Oracle 12, Postgres, ...) consultez la doc : postgresql.org/docs/current/sql-select.html

38voto

Wolfgang Vollmann Points 101

Je viens de tester dans Postgres 9.1 une solution qui est proche de Oracle ROWNUM :

select row_number() over() as id, t.*
from information_schema.tables t;

7 votes

Notez que cela ne respectera pas un ORDER BY dans la requête externe.

9voto

Bob Points 9217

Si vous voulez juste un numéro pour revenir, essayez ceci.

create temp sequence temp_seq;
SELECT inline_v1.ROWNUM,inline_v1.c1
FROM
(
select nextval('temp_seq') as ROWNUM, c1 
from sometable
)inline_v1;

Vous pouvez ajouter un ordre par au SQL inline_v1 pour que votre ROWNUM ait une signification séquentielle pour vos données.

select nextval('temp_seq') as ROWNUM, c1 
from sometable
ORDER BY c1 desc;

Ce n'est peut-être pas le plus rapide, mais c'est une option si vous en avez vraiment besoin.

4voto

Kaushik Nayak Points 25442

Si vous avez une clé unique, vous pouvez utiliser COUNT(*) OVER ( ORDER BY unique_key ) as ROWNUM

SELECT t.*, count(*) OVER (ORDER BY k ) ROWNUM 
FROM yourtable t;

| k |     n | rownum |
|---|-------|--------|
| a | TEST1 |      1 |
| b | TEST2 |      2 |
| c | TEST2 |      3 |
| d | TEST4 |      4 |

DEMO

1 votes

C'était exactement le besoin que j'avais et cela a résolu mon problème. Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X