sql >> Database teknologi >  >> RDS >> Mysql

Hvordan vælger jeg kolonne(r) efter deres numeriske placering i en tabel?

Du bør næsten ALDRIG stole på kolonnenummer i en tabel i nogen af ​​dine koder (selvom du teoretisk set KAN gøre det teknisk).

Der er mange grunde, en af ​​de vigtigste er, at nogen altid kan ÆNDRE tabellen og indsætte en kolonne i begyndelsen/midten, hvilket ødelægger din kode fuldstændigt.

En anden grund er, at kolonnepositioner - selvom du antager, at tabellen aldrig ændrer sig - gør koden absolut ULÆSLIG og derfor umulig at vedligeholde. Kan du huske, at kolonne 13 var "last_name_3" 2 år fra nu?

Bemærk venligst, at hvis dit problem er, at du for eksempel har noget som SELECT fn11, fn12, fn13, ... fn32 i din kode, og du har lyst til at stave fn11..fn32 er et træk, du er ikke kun 100% korrekt, men du bør absolut fjerne nævnte træk via Perl-idiomer, som følger:"SELECT " . join(", ", map { "fn$_" } (11..32));

Når det er sagt, hvis du gerne vil vide hvordan man gør det TEORETISK, bare som en "fed teknologisk trick" øvelse, så kender jeg ikke til en god måde at gøre det generisk via DBI, men man kan normalt gøre det i database- bestemt måde.

For at gøre det skal du bemærke, at:

  1. Stort set ALLE databaser opretter tabeller via en slags "CREATE TABLE"-sætning, som tager en ORDERED-liste af kolonner (de fleste relationelle databaser gemmer faktisk værdier i rækken i den rækkefølge, så det er vigtigt - også selvom teoretisk relationskalkyle behandler kolonner som rækkefølge- mindre som Marcog sagde).

  2. Stort set ALLE da;tabaser indeholder en speciel tabel, som viser hvilke tabeller der indeholder hvilke kolonner (syscolumns i Sybase, INFORMATION_SCHEMA.COLUMNS i MySQL), og den tabel indeholder numerisk ID for en kolonne, som bruges til at bestille dem på samme måde som "opret" rækkefølge; eller endda et særligt "ordre"-felt (f.eks. ORDINAL_POSITION værdi i MySQL).

    Så du kan - i forvejen - forespørge på den ordnede liste over kolonner for den tabel, du ønsker, og deres rækkefølge. For at forespørge efter MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Gem dataene i @columns-listen (eller hvis du har mange tabeller, en hash af arrays, %columns, hvor tabelnavnet er nøglen).

    Så, når du bygger en forespørgsel, siger du blot

    "select $columns{table1}->[11],$columns{table1}->[13], ...."

    Bemærk venligst, at den faktiske SQL sendt til serveren vil indeholde kolonnenavne, MEN du vil ikke hårdkode disse navne nogen steder i din kode.



  1. UNIK begrænsning vs kontrol før INSERT

  2. FEJL 1698 (28000):Adgang nægtet for brugeren 'root'@'localhost'

  3. Postgresql intarray fejl:udefineret symbol:pfree

  4. Hvordan NOT LIKE virker i MySQL