Re: enumerating rows

Поиск
Список
Период
Сортировка
От Oliver Elphick
Тема Re: enumerating rows
Дата
Msg-id 200104111646.f3BGkM205840@linda.lfix.co.uk
обсуждение исходный текст
Ответ на Re: enumerating rows  (Kovacs Zoltan <kovacsz@pc10.radnoti-szeged.sulinet.hu>)
Ответы Re: enumerating rows  (Kovacs Zoltan <kovacsz@pc10.radnoti-szeged.sulinet.hu>)
Список pgsql-sql
Kovacs Zoltan wrote:
  >> Use the "serial" column type.
  >Unfortunately it's not what I expect. Assume that I have an arbitrary
  >"SELECT expr1 as column1, expr2 as column2, ..." which gives
  >
  >column1 | column2 |  ...
  >--------+---------+- ...
  >......data..............
  >........................
  >
  >I would like to get the same result with the only plus column row_no:
  >
  >row_no | column1 | column2 |  ...
  >-------+---------+---------+- ...
  >     1 | ......data..............
  >     2 | ........................
  >.................................
  >
  >with a new SELECT statement: "SELECT ?????, expr1 as column1, expr2 as
  >column2, ...". What to write instead of ??????

Here is a method which is fairly cumbersome, but will do what you want.
(Whether what you want is useful, is another matter.  The row numbers
have no meaning except to delineate which row is printed after which; they
bear no relation to their order in the table.)

Create the C code shown in the attachment.

Compile it (the example shown is for Linux, see the programmer's manual for
how to do it on other systems):

   gcc -fpic -c rowno.c
   gcc -shared -o rowno.so rowno.o

In the database, create functions as shown (remember to change
the directory from /tmp!):

 CREATE FUNCTION reset_row() RETURNS int4
     AS '/tmp/rowno.so' LANGUAGE 'C';


 CREATE FUNCTION row_no() RETURNS int4
     AS '/tmp/rowno.so' LANGUAGE 'C';

Now you can use the function:

bray=# select row_no() as row,id,name from person;
 row  |   id   |                         name
------+--------+-------------------------------------------------------
    1 | 100001 | Mr Graham Love (Director)
    2 | 100002 | AILEEN BROWN
...

but you have to do this in between queries:

bray=# select reset_row();


because the numbers don't reset themselves:

bray=# select row_no() as row,id,name from person;
  row  |   id   |                         name
-------+--------+-------------------------------------------------------
  6015 | 100001 | Mr Graham Love (Director)
  6016 | 100002 | AILEEN BROWN
...

Oliver Elphick                                Oliver.Elphick@lfix.co.uk
Isle of Wight                              http://www.lfix.co.uk/oliver
PGP: 1024R/32B8FAA1: 97 EA 1D 47 72 3F 28 47  6B 7E 39 CC 56 E4 C1 47
GPG: 1024D/3E1D0C1C: CA12 09E0 E8D5 8870 5839  932A 614D 4C34 3E1D 0C1C
                 ========================================
     "Is any one of you in trouble? He should pray. Is
      anyone happy? Let him sing songs of praise. Is any one
      of you sick? He should call the elders of the church
      to pray over him...The prayer of a righteous man is
      powerful and effective."         James 5:13,14,16

Вложения

В списке pgsql-sql по дате отправления:

Предыдущее
От: "Koen Antonissen"
Дата:
Сообщение: RE: enumerating rows
Следующее
От: Kovacs Zoltan
Дата:
Сообщение: Re: enumerating rows