Discussione:
Lista di record con numero progressivo su Postgresql
(troppo vecchio per rispondere)
Marcello Verona
2008-12-24 15:41:08 UTC
Permalink
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
orsopoeta
2008-12-25 00:15:45 UTC
Permalink
Post by Marcello Verona
è possibile realizzare la stessa cosa con Postgres?
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

***@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=#
Alessandro Pellizzari
2008-12-25 06:59:33 UTC
Permalink
Post by orsopoeta
è possibile realizzare la stessa cosa con Postgres? Se si con quale
sintassi?
si, pero' studiati qualcosa sulle sequence...
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.
Marcello Verona
2008-12-25 14:38:33 UTC
Permalink
Post by Alessandro Pellizzari
Post by orsopoeta
è possibile realizzare la stessa cosa con Postgres? Se si con quale
sintassi?
si, pero' studiati qualcosa sulle sequence...
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.
Esatto, è così.
Post by Alessandro Pellizzari
Non so se Psql abbia delle "variabili" come MySQL o se sia necessario
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
orsopoeta
2008-12-26 17:43:58 UTC
Permalink
ma non ho capito se postgres permette la creazione di variabili
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
Enrico 'Henryx' Bianchi
2008-12-26 20:40:55 UTC
Permalink
Post by orsopoeta
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

Loading...