Newsgroup: it.comp.software.database
Titolo: Lista di record con numero progressivo su Postgresql

Vorrei creare al volo una colonna contatore su Postgres come faccio con 
MySQL.
Con MySQL questa cosa si può fare così:
mysql> set @N = 0;
Query OK, 0 rows affected (0.27 sec)
mysql> SELECT @N := @N +1 AS numero, nome,stipendio,genere FROM persone;
+--------+--------+-----------+--------+
| numero | nome   | stipendio | genere |
+--------+--------+-----------+--------+
|      1 | John   |      5000 | m      |
|      2 | Mario  |      6000 | m      |
|      3 | Frank  |      5000 | m      |
|      4 | Otto   |      6000 | m      |
|      5 | Susan  |      5500 | f      |
|      6 | Martin |      5500 | m      |
|      7 | Mary   |      5500 | f      |
|      8 | Bill   |      5000 | m      |
|      9 | June   |      6000 | f      |
+--------+--------+-----------+--------+
9 rows in set (0.01 sec)
è possibile realizzare la stessa cosa con Postgres?
Se si con quale sintassi?
Grazie mille.
Marcello

 Se si con quale sintassi?
si, pero' studiati qualcosa sulle sequence...
usa il tipo di dato serial, come nell'esempio che ti incollo.
ciao e buon natale
postgres@gundam:/usr/local/pgsql/bin$ psql testdb
Welcome to psql 8.3.1, the PostgreSQL interactive terminal.
testdb=# CREATE TABLE t3 (
testdb(# c1 varchar(2),
testdb(# c2 varchar(2));
CREATE TABLE
Time: 301.088 ms
testdb=# INSERT INTO t3 VALUES ('aa', 'bb');
INSERT 0 1
Time: 69.311 ms
testdb=# INSERT INTO t3 VALUES ('cc', 'dd');
INSERT 0 1
Time: 2.245 ms
testdb=# select * from t3;
 c1 | c2
----+----
 aa | bb
 cc | dd
(2 rows)
Time: 18.945 ms
testdb=# ALTER TABLE t3 ADD numero SERIAL;
NOTICE:  ALTER TABLE will create implicit sequence "t3_numero_seq" for 
serial column "t3.numero"
ALTER TABLE
Time: 167.827 ms
testdb=# select * from t3;
 c1 | c2 | numero
----+----+--------
 aa | bb |      1
 cc | dd |      2
(2 rows)
Time: 1.287 ms
testdb=#

 usa il tipo di dato serial, come nell'esempio che ti incollo.
Credo che gli servisse qualcosa di non memorizzato in DB, ma una colonna 
fittizia in fase di select.
Non so se Psql abbia delle "variabili" come MySQL o se sia necessario 
ricorrere a sequenze temporanee.
Bye.

 ricorrere a sequenze temporanee.
Non saprei neppure come farle... perché in realtà il sistema che mi 
occorre è astratto rispetto alle strutture della singola tabella.
Non conosco a priori la tabella, né quali campi verranno utilizzati per 
l'ordinamento.
Il sistema per cui mi occorre è un'applicazione open source (VFront) che 
permette di creare maschere per la gestione di db online.
Ho cercato qualcosa di simile a quanto fa mysql con le variabili, ma non 
ho capito se postgres permette la creazione di variabili custom ed al 
volo... mi pare di no...
E' così?
Grazie... e buon Natale!
Marcello

 custom ed al volo... mi pare di no...
testdb=# \set a 3;
testdb=# select :a;
 ?column?
----------
        3
(1 row)
pero' non saprei dirti come usarle per i tuoi scopi :o/
ciao
Rob

 pero' non saprei dirti come usarle per i tuoi scopi :o/
Non saprei nemmeno io come potrebbe usarle, visto che \set mi sa molto
di psql, mentre lui deve usarla tramite applicazione. A questo punto
penso che l'unica sia usare una sequenza temporanea:
postgres=# create table test (uno varchar(30));
CREATE TABLE
postgres=# insert into test values('a'),('b'),('c');
INSERT 0 3
postgres=# create temporary sequence test_seq;
CREATE SEQUENCE
postgres=# select nextval('test_seq'), uno from test;
 nextval | uno 
---------+-----
       1 | a
       2 | b
       3 | c
(3 rows)
postgres=#
Dopo la query puo` procedere in due modi:
- Chiudere la connessione (la clausola TEMPORARY serve a creare una
  sequenza che "vive" solo all'interno della connessione);
- Droppare esplicitamente la sequenza.
Nonostante questo sia un buon metodo, personalmente spero che ve ne
siano altri per ottenere il risultato richiesto (anche perche` questo, a
meno di reinizializzare la sequenza tramite un ALTER SEQUENCE, vale per
l'esecuzione di una sola query per volta)
Enrico