PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Spaltenreihenfolge in SELECT *-Anweisung - garantiert?

Betrachten wir den SQL-Standard, Abschnitt 7.9 <query specification> wie hier angegeben:

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.

Mit anderen Worten, ja, der SQL-Standard gibt an, dass Spalten gemäß ihrer Ordinalposition innerhalb von T projiziert werden sollen . Beachten Sie, dass es etwas knifflig wird, wenn Ihr <table expression> besteht aus mehreren Tabellen mit JOIN .. USING oder NATURAL JOIN Klauseln. Wenn Sie jedoch aus einer einfachen Tabelle auswählen, können Sie davon ausgehen, dass die Reihenfolge wie erwartet ist.

Der Vollständigkeit halber die Bedeutung einer ordinal position within T für Tabellen wird weiter unten in 11.4 <column definition> erläutert :

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

Und dann in 11.11 <add column definition> (für ALTER TABLE Erklärungen)

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

Es gibt noch einige andere SQL-Anweisungen und -Klauseln, die von der formalen Angabe von ordinal positions abhängen innerhalb von <table expressions> . Einige Beispiele:

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

Insbesondere Postgres ist ziemlich standardkonform, wenn Sie also wirklich SELECT * möchten , mach weiter!