sql >> データベース >  >> RDS >> Mysql

テーブル内の数値位置で列を選択するにはどうすればよいですか?

    理論的には技術的にそうすることができますが、どのコードでもテーブルの列番号に依存することはほとんどありません。

    多くの理由がありますが、最も重要な理由の1つは、誰かがいつでもテーブルを変更し、先頭/途中に列を挿入して、コードを完全に壊すことができるということです。

    2番目の理由は、列の位置(テーブルが変更されないと仮定した場合でも)が完全に読み取り不能になるため、コードを維持できないことです。 13列目が2年後の「last_name_3」だったことを覚えていますか?

    たとえば、SELECT fn11, fn12, fn13, ... fn32のような問題がある場合は注意してください。 コード内で、fn11..fn32をスペルアウトすると、ドラッグであると感じます。100%正しいだけでなく、次のように、Perlイディオムを介してドラッグを完​​全に削除する必要があります。"SELECT " . join(", ", map { "fn$_" } (11..32));

    そうは言っても、理論的にそれを行う方法を知りたい場合は、「クールな技術的トリック」の演習と同じように、DBIを介して一般的にそれを行う良い方法はわかりませんが、通常はデータベースで行うことができます-特定の方法。

    そのためには、次の点に注意する必要があります。

    1. ほとんどすべてのデータベースは、列のORDEREDリストを受け取るある種の「CREATETABLE」ステートメントを介してテーブルを作成します(ほとんどのリレーショナルデータベースは、実際にはその順序で行に値を物理的に格納するため、理論的な関係論理が列を順序として扱う場合でも重要です-マルコグが言ったように少ない)。

    2. ほとんどすべての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には列名が含まれますが、コード内のどこにもそれらの名前をハードコーディングすることはありません。



    1. MySQLクエリがワイルドになりましたか?

    2. 条件付き注文

    3. MySQLはクエリでORDERBYとLIMITをどのように処理しますか?

    4. dockerpostgrespgadminローカル接続