PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ordre des colonnes dans l'instruction SELECT * - garanti ?

Considérons le standard SQL, section 7.9 <query specification> comme spécifié ici :

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.

Donc, en d'autres termes, oui, la norme SQL spécifie que les colonnes doivent être projetées en fonction de leur position ordinale dans T . Notez que les choses deviennent un peu délicates lorsque votre <table expression> se compose de plusieurs tables impliquant JOIN .. USING ou NATURAL JOIN clauses. Cependant, lors de la sélection à partir d'un tableau simple, vous pouvez probablement supposer que la commande est conforme à vos attentes.

Pour être complet, la signification d'une ordinal position within T pour les tableaux est expliqué plus bas dans 11.4 <column definition> :

General Rules
     5) [...] The ordinal position included
        in the column descriptor is equal to the degree of T. [...]

Et puis dans 11.11 <add column definition> (pour ALTER TABLE déclarations)

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>".

Il existe de nombreuses autres instructions et clauses SQL qui dépendent de la spécification formelle des ordinal positions dans <table expressions> . Quelques exemples :

13.8 <insert statement> 
     (when omitting the `<insert column list>`)
20.2 <direct select statement: multiple rows>
     (when `<sort specification>` contains an `<unsigned integer>`)

Postgres, en particulier, est assez conforme aux normes, donc si vous voulez vraiment SELECT * , allez-y !