理論的には技術的にそうすることができますが、どのコードでもテーブルの列番号に依存することはほとんどありません。
多くの理由がありますが、最も重要な理由の1つは、誰かがいつでもテーブルを変更し、先頭/途中に列を挿入して、コードを完全に壊すことができるということです。
2番目の理由は、列の位置(テーブルが変更されないと仮定した場合でも)が完全に読み取り不能になるため、コードを維持できないことです。 13列目が2年後の「last_name_3」だったことを覚えていますか?
たとえば、SELECT fn11, fn12, fn13, ... fn32
のような問題がある場合は注意してください。 コード内で、fn11..fn32をスペルアウトすると、ドラッグであると感じます。100%正しいだけでなく、次のように、Perlイディオムを介してドラッグを完全に削除する必要があります。"SELECT " . join(", ", map { "fn$_" } (11..32));
そうは言っても、理論的にそれを行う方法を知りたい場合は、「クールな技術的トリック」の演習と同じように、DBIを介して一般的にそれを行う良い方法はわかりませんが、通常はデータベースで行うことができます-特定の方法。
そのためには、次の点に注意する必要があります。
-
ほとんどすべてのデータベースは、列のORDEREDリストを受け取るある種の「CREATETABLE」ステートメントを介してテーブルを作成します(ほとんどのリレーショナルデータベースは、実際にはその順序で行に値を物理的に格納するため、理論的な関係論理が列を順序として扱う場合でも重要です-マルコグが言ったように少ない)。
-
ほとんどすべてのda;tabaseには、どのテーブルにどの列が含まれているかを一覧表示する特別なテーブルが含まれています(
syscolumns
Sybaseでは、INFORMATION_SCHEMA.COLUMNS
MySQLの場合)、そのテーブルには、「作成」順序と同じように順序付けするために使用される列の数値IDが含まれています。または、特別な「注文」フィールド(例:ORDINAL_POSITION
MySQLの値)。したがって、事前に、必要なテーブルの列の順序付きリストとその順序を照会できます。 MySQLを照会するには、
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
。データを@columnsリストに格納します(または、テーブルが多数ある場合は、配列のハッシュ、%columns、テーブル名がキーになります)。次に、クエリを作成するときに、次のように言います
"select $columns{table1}->[11],$columns{table1}->[13], ...."
実際に注意してください サーバーに送信されるSQLには列名が含まれますが、コード内のどこにもそれらの名前をハードコーディングすることはありません。