2011-01-01 16 views
1

テーブルの「x」の位置で列を選択しようとしています。テーブル内の「数値」位置で列を選択するにはどうすればよいですか?

DBI

my $example = $hookup->prepare(qq{SELECT This,That,Condition,"I also want COLUMN-10" FROM tbl LIMIT ? ?}); 

    ###column_number=10 ordinal_position?? 
    $example->execute('2','10') or die "Did not execute"; 

が、これは可能ですか私はちょうどその列に別の単一の選択を実行する必要がありますか?

私が遭遇した問題の1つは、「条件」という名前のcolでした。何らかの理由で、私がselect Conditionにしようとすると、実行は死ぬでしょう。私は決して試みませんでしたが、列名がSELECTの場合はどうなりますか?

もう1つの注意点は、テーブルの幅は75桁で、50個だけ必要です。 Colの名前はかなり冗長ですので、私はそれらを "位置"で呼びたいと思います。これにより、将来select文を変更することなくcol名を変更することもできます。

私は非常に初心者ですので、私のレベルに答えを説明してください。何か助けていただきありがとうございます。

+0

PS行オフセット2 10はテストに関連していません。 – DulcimerDude

答えて

1

COLUMNS.ORDINAL_POSITIONhereを参照)を読むことができますが、これは起こるのを待っている災害のようです。

列名を ``、例えば ``で囲むことができます。 SELECT `colname`。これは、テーブル名がConditionまたはSELECTのケースを処理します。

+2

ありがとうございます。あなたの答えは役に立ちました。引用符の使用が私の問題の一つを修正したことを指摘する。私が今年学んだ最初の事!!! – DulcimerDude

+0

@marcog - それはまったく正しいわけではありません。カラムは、たとえその位置が前記実装の根底にある理論的な関係計算の一部ではないとしても、特定のデータベースサーバ実装(おそらくそれらすべて)における位置を定義している。ちょっとしたことに、ほとんどすべてのデータベースサーバーは、列を順番に列挙したステートメントを持つテーブルを作成し、大部分は、正しい順序で各列の順序付き数値IDを持つ特別な「テーブル '列」テーブルにそのテーブル情報を格納します。 – DVK

+0

@marcog - もちろん、あなたのコードの中のテーブルのカラム番号に決して頼るべきではないという事実を忘れないでください(他の理由で誰かがいつもテーブルを変更し、 – DVK

2

理論的には理論的には技術的に行うことはできますが、コード内の表の列番号はほとんど決して使用しないでください。

多くの理由がありますが、誰かがいつもテーブルを変更し、最初から最後まで列を挿入してコードを完全に破ることが重要です。

第2の理由は、テーブルが決して変更されないと仮定しても、列の位置が絶対にUNREADABLEであり、したがってコードを維持できないということです。今から2年後の第13列が「last_name_3」だったことを覚えていますか?

たとえば、コードにSELECT fn11, fn12, fn13, ... fn32のようなものがあり、fn11..fn32のスペルが気に入っていれば、100%正しいだけでなく、絶対に削除する必要があります次のようにPerlのイディオムを介したドラッグは、言った:"SELECT " . join(", ", map { "fn$_" } (11..32));


は、あなただけの「クールな技術トリック」運動として、理論的にはそれを行う方法を知りたい場合は、私は良いのかわからない、と述べましたDBIを使って一般的に行う方法ですが、通常はデータベース固有の方法で実行できます。そうするには

、あなたはそれを注意する必要があります。

  1. ほとんどすべてのデータベースは、列の順序付きリストを受け取り文の「CREATE TABLE」を何らかの経由でテーブルを作成し、ほとんどのリレーショナルデータベースは、実際に物理的に値を格納します(その順序で列に並んでいるので、たとえ理論的な関係計算で列が「marcog」のように順序なしとして扱われても、重要です。

  2. ほとんどのALL; tabasesには、どのテーブルにどの列(Sybaseのsyscolumns、MySQLではINFORMATION_SCHEMA.COLUMNS)が含まれているかを示す特殊なテーブルがあり、 "オーダーを作成する";または特別な「注文」フィールド(たとえば、MySQLではORDINAL_POSITIONの値)です。

    したがって、必要なテーブルとその順序の列の順序付きリストを照会することができます。 MySQLを照会するには、SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"。 @columnsリストにデータを格納します(または、テーブルが多数ある場合は配列のハッシュ、%カラム、テーブル名はキー)。クエリを構築するときに

    その後、あなたは単にどこでもそれらの名前のサーバーに送信され実際 SQLは、列名が含まれますのでご注意ください、しかし、あなたはハードコードしません

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

    を言いますあなたのコードで。

+0

この回答はRELATIONALデータベースにのみ適用されます。一部の/すべての非リレーショナルDBは、実際に定義された列順序やアクセス可能な列順序を持っていない可能性は低いですが、DBサーバーに依存していると言われています。 – DVK

関連する問題