sql >> Database >  >> RDS >> Mysql

Hoe selecteer ik kolom(men) op hun numerieke positie in een tabel?

U moet bijna NOOIT vertrouwen op het kolomnummer in een tabel in uw code (ook al KUNT u dit technisch gezien wel doen).

Er zijn veel redenen, een van de belangrijkste is dat iemand altijd de tabel kan WIJZIGEN en een kolom aan het begin / midden kan invoegen, waardoor je code volledig wordt verbroken.

Een tweede reden is dat kolomposities - zelfs als je ervan uitgaat dat de tabel nooit verandert - absoluut ONLEESBARE en daarom onmogelijk te onderhouden code maken. Weet je nog dat kolom 13 over 2 jaar "last_name_3" was?

Houd er rekening mee dat als uw probleem is dat u bijvoorbeeld iets heeft als SELECT fn11, fn12, fn13, ... fn32 in je code, en je hebt zin om te spellen dat fn11..fn32 een sleep is, heb je niet alleen 100% gelijk, maar je moet absoluut de drag verwijderen via Perl-idioom, als volgt:"SELECT " . join(", ", map { "fn$_" } (11..32));

Dat gezegd hebbende, als je wilt weten hoe je het THEORETISCH moet doen, net als een "coole technologische truc" -oefening, ken ik geen goede manier om het generiek te doen via DBI, maar je kunt het meestal doen in database- specifieke manier.

Houd er rekening mee dat:

  1. Vrijwel ALLE databases maken tabellen via een soort "CREATE TABLE" -instructie die een ORDERED-lijst met kolommen nodig heeft (de meeste relationele databases slaan fysiek waarden in de rij op in die volgorde, dus het is belangrijk - zelfs als theoretische relationele calculus kolommen als volgorde behandelt- minder zoals marcog zei).

  2. Vrijwel ALLE databases bevatten een speciale tabel waarin wordt vermeld welke tabellen welke kolommen bevatten (syscolumns in Sybase, INFORMATION_SCHEMA.COLUMNS in MySQL), en die tabel bevat een numerieke ID van een kolom die wordt gebruikt om ze op dezelfde manier te bestellen als "create" -volgorde; of zelfs een speciaal "bestel"-veld (bijv. ORDINAL_POSITION waarde in MySQL).

    U kunt dus - van tevoren - de geordende lijst met kolommen opvragen voor de gewenste tabel en hun volgorde. Voor een query voor MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Sla de gegevens op in de @columns-lijst (of als je veel tabellen hebt, een hash van arrays, %columns, waarbij de tabelnaam de sleutel is).

    Wanneer u vervolgens een query maakt, zegt u gewoon

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

    Houd er rekening mee dat de werkelijke SQL die naar de server wordt verzonden, bevat kolomnamen, MAAR u zult die namen nergens in uw code hardcoderen.



  1. Groot databasebeheersysteem:ontwerp en architect

  2. Gegevens koppelen aan of importeren uit Salesforce

  3. Controleer of de tabel bestaat en als deze niet bestaat, maak deze dan aan in SQL Server 2008

  4. Wijzig een CHECK-beperking in SQL Server met behulp van T-SQL