Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie wähle ich Spalten nach ihrer numerischen Position in einer Tabelle aus?

Sie sollten sich in Ihrem Code fast NIEMALS auf die Spaltennummer in einer Tabelle verlassen (auch wenn Sie dies technisch gesehen KÖNNEN).

Es gibt viele Gründe, einer der wichtigsten ist, dass jemand die Tabelle immer ÄNDERN und eine Spalte am Anfang / in der Mitte einfügen kann, wodurch Ihr Code vollständig gebrochen wird.

Ein zweiter Grund ist, dass Spaltenpositionen – selbst wenn Sie davon ausgehen, dass sich die Tabelle nie ändert – zu absolut UNLESBAREM und daher unmöglich zu wartendem Code führen. Können Sie sich daran erinnern, dass Spalte 13 in 2 Jahren "last_name_3" war?

Bitte beachten Sie, wenn Ihr Problem zum Beispiel darin besteht, dass Sie etwas wie SELECT fn11, fn12, fn13, ... fn32 haben in Ihrem Code und Sie das Gefühl haben, fn11..fn32 zu buchstabieren, ist ein Ziehen, Sie haben nicht nur 100% Recht, sondern Sie sollten dieses Ziehen unbedingt über Perl-Idiome wie folgt entfernen:"SELECT " . join(", ", map { "fn$_" } (11..32));

Wenn Sie wissen möchten, wie es THEORETISCH geht, nur als "cooler technologischer Trick", kenne ich keine gute Möglichkeit, dies generisch über DBI zu tun, aber Sie können es normalerweise in der Datenbank tun. bestimmten Weise.

Beachten Sie dazu Folgendes:

  1. So ziemlich ALLE Datenbanken erstellen Tabellen über eine Art "CREATE TABLE"-Anweisung, die eine ORDERED-Liste von Spalten verwendet (die meisten relationalen Datenbanken speichern tatsächlich Werte in der Zeile in dieser Reihenfolge, daher ist es wichtig - auch wenn die theoretische relationale Berechnung Spalten als Reihenfolge behandelt - weniger als Marcog sagte).

  2. So ziemlich ALLE Datenbanken enthalten eine spezielle Tabelle, die auflistet, welche Tabellen welche Spalten enthalten (syscolumns in Sybase, INFORMATION_SCHEMA.COLUMNS in MySQL), und diese Tabelle enthält die numerische ID einer Spalte, die verwendet wird, um sie genauso zu ordnen wie die "Erstellungs" -Reihenfolge; oder sogar ein spezielles "Reihenfolge"-Feld (z. B. ORDINAL_POSITION Wert in MySQL).

    So können Sie - im Voraus - eine geordnete Liste von Spalten für die gewünschte Tabelle und deren Reihenfolge abfragen. Um nach MySQL abzufragen, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Speichern Sie die Daten in der @columns-Liste (oder, wenn Sie viele Tabellen haben, einem Hash von Arrays, %columns, wobei der Tabellenname der Schlüssel ist).

    Wenn Sie dann eine Abfrage erstellen, sagen Sie einfach

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

    Bitte beachten Sie, dass die aktuelle SQL, das an den Server gesendet wird, enthält Spaltennamen, ABER Sie werden diese Namen nirgendwo in Ihrem Code fest codieren.