sql >> Database >  >> RDS >> PostgreSQL

kolomvolgorde in SELECT * instructie - gegarandeerd?

Laten we eens kijken naar de SQL-standaard, sectie 7.9 <query specification> zoals hier gespecificeerd:

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.

Dus, met andere woorden, ja, de SQL-standaard specificeert dat kolommen moeten worden geprojecteerd volgens hun ordinale positie binnen T . Houd er rekening mee dat het een beetje lastig wordt wanneer uw <table expression> bestaat uit verschillende tabellen met JOIN .. USING of NATURAL JOIN clausules. Als u echter uit een eenvoudige tafel kiest, gaat het waarschijnlijk goed, ervan uitgaande dat de bestelling is zoals verwacht.

Voor de volledigheid, de betekenis van een ordinal position within T voor tabellen wordt verderop uitgelegd in 11.4 <column definition> :

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

En dan in 11.11 <add column definition> (voor ALTER TABLE verklaringen)

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

Er zijn nogal wat andere SQL-statements en -clausules die afhankelijk zijn van de formele specificatie van ordinal positions binnen <table expressions> . Enkele voorbeelden:

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

Vooral Postgres voldoet behoorlijk aan de normen, dus als je echt wilt SELECT * , ga je gang!




  1. MyBatis Lijstwaarden invoegen

  2. cursor:pin S wacht op X

  3. SQL-query retourneert gegevens uit meerdere tabellen

  4. Proberen om een ​​Oracle te exporteren via PL/SQL geeft een datum van 0000-00-00