PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ordem das colunas na instrução SELECT * - garantido?


Vamos considerar o padrão SQL, seção 7.9 <query specification> conforme especificado aqui:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
<query specification> ::=
          SELECT [ <set quantifier> ] <select list> <table expression>
[...]
<select list> ::=
            <asterisk>
          | <select sublist> [ { <comma> <select sublist> }... ]

[...]
Syntax Rules
1) Let T be the result of the <table expression>.
3) Case:
       a) [...]
       b) Otherwise, the <select list> "*" is equivalent to a <value
          expression> sequence in which each <value expression> is a
          <column reference> that references a column of T and each
          column of T is referenced exactly once. The columns are ref-
          erenced in the ascending sequence of their ordinal position
          within T.

Então, em outras palavras, sim, o padrão SQL especifica que as colunas devem ser projetadas de acordo com sua posição ordinal dentro de T . Observe que as coisas ficam um pouco complicadas quando sua <table expression> consiste em várias tabelas envolvendo JOIN .. USING ou NATURAL JOIN cláusulas. No entanto, ao selecionar a partir de uma tabela simples, você provavelmente estará bem assumindo que a ordem está conforme o esperado.

Para completar, o significado de uma ordinal position within T para tabelas é explicado mais abaixo em 11.4 <column definition> :
General Rules
     5) [...] The ordinal position included
        in the column descriptor is equal to the degree of T. [...]

E então em 11.11 <add column definition> (para ALTER TABLE declarações)
General Rules
     4) [...] In particular, the degree of T
        is increased by 1 and the ordinal position of that column is
        equal to the new degree of T as specified in the General Rules
        of Subclause 11.4, "<column definition>".

Existem algumas outras instruções e cláusulas SQL que dependem da especificação formal de ordinal positions dentro de <table expression> . Alguns exemplos:
13.8 <insert statement> 
     (when omitting the `<insert column list>`)
20.2 <direct select statement: multiple rows>
     (when `<sort specification>` contains an `<unsigned integer>`)

O Postgres, em particular, é bastante compatível com os padrões, portanto, se você realmente deseja SELECT * , vá em frente!