Select com contador ! resolvido

3 respostas
K

E aí pessoal?

Eu queria fazer uma consulta SQL onde um de seus campos seja um contador de registros, cujo resultado possa ser semelhante ao exemplo abaixo:

| nr_ordem | NOME
-------------------------------
|    1     | Joaquim
|    2     | Pedro
|    3     | Mané
...sendo que o campo nr_ordem não existe fisicamente na tabela (a tabela só possui um campo, que é o campo NOME),

Eu uso postgresql. Se alguém souber...

Abraços a todos.

3 Respostas

B

Meu caro a maneira mais facil de voce fazer isso é colocar uma coluna sendo chave primaria com auto-incremento.

K

Esta é a questão!

Não pode haver um campo para ordenar o select. Se assim o fosse, seria muito fácil.
A tabela poderia ter vários outros campos e eu poderia ordenar do jeito que quisesse, porém, eu queria mostrar no mesmo select o INDEX, ou seja, a posição do recordset naquele select.
Suponha que exista um campo IDADE_DA_PESSOA.
Quando eu fizer:

o resultado seria uma coleção com todos os registros da tabela ordenado por IDADE_DA_PESSOA. Daí vem o patrão e me solicita “Me passe o número de ordem do Joaquim”, daí eu teria que “contar” manualmente todos os registros até chegar no Joaquim e, assim, descobrindo qual é a sua posição.
A idéia é colocar dentro do select (se é que tem jeito de se fazer isto) um campo que vá calculando o número de ordem do 1 (um) até o último, exatamente como fazemos numa planilha de excel.
Obrigado.

K

OK, depois de pesquisar:

1) Ainda não existe uma função interna no postgre capaz de fazer isto (nem em qualquer outro SGDB), mas a versão 8.4 trará esta funcionalidade;
2) Portanto, não é possível realizar esta proeza com uma única instrução select;

3) É possível simular usando uma instrução como abaixo (que, por enquanto, é uma solução fornecida), mas é obrigatório o uso de uma coluna contendo a chave primária, mesmo que esta chave primária seja do tipo varchar:

Para testar, crie uma tabela e popule ela:

CREATE TABLE pessoa(
	id varchar(50) PRIMARY KEY, 
	nome varchar(50), 
	idade_da_pessoa integer);
	
INSERT INTO pessoa(id, nome, idade_da_pessoa)
(VALUES ('0001-sp', 'Joaquim', 44), 
	('5977-rj', 'Pedro', 21), 
	('sp-tec-999', 'Mané', 53));

...em seguida, execute a instrução abaixo (que é a solução do problema):

SELECT nr_ordem, oldtable.*
FROM (SELECT * FROM pessoa) As oldtable
CROSS JOIN (SELECT ARRAY(SELECT id  
        FROM pessoa 
        ORDER BY idade_da_pessoa) As id_join)  AS oldids
CROSS JOIN generate_series(1, (SELECT COUNT(*) 
                    FROM pessoa)) AS nr_ordem
WHERE oldids.id_join[nr_ordem] =  oldtable.id
ORDER BY nr_ordem;

E o resultado é este:

1 | 5977-rj     | Pedro     | 21
2 | 0001-sp     | Joaquim   | 44
3 | sp-tec-999  | Mané      | 53

...resolvido o problema.
Até mais.

Criado 26 de fevereiro de 2009
Ultima resposta 26 de fev. de 2009
Respostas 3
Participantes 2