2013-03-19 18 views
5

列名を選択したいが、前もってテーブル構造がわからず、変更される可能性があるので、列名でselect文をハードコードすることはできない。私はまた、すべての列を選択したくありません。これを行う簡単な方法はありますか?mySQLで列名を動的に選択する方法

私の考えは、これらの2つのクエリのいくつかの種類の組み合わせですが、私のSQLはそれほど良くありません。

SHOW COLUMNS FROM table_name; 
SELECT * FROM table_name; 

サブセレクトを使用しようとしましたが機能しませんでした。何が起こるように思わない、私はちょうど何の結果

SELECT (SELECT column_name 
     FROM information_schema.columns 
     WHERE table_name ='table_name') 
FROM table_name; 

は、たぶん私は参加していますか?... とにかくすべてのヘルプは素晴らしいことだ、感謝

+4

表の構造が絶えず変化しているのは奇妙に思えますが、これは設計上の欠陥のようです。あなたはあなたの現在の構造を投稿したり、あなたのテーブルにもっと多くのコンテキストを提供できますか? – Taryn

+0

絶えず変化しているわけではありません。しかし、テーブルの最終的な構造はまだ石で設定されていませんので、私は将来どのような変更に適応するほどスマートなシステムを作りようとしています。私は前もってカラム名を知らない。私は2つの別々のクエリでPHPでこれを行うことができましたが、私はデータベースレイヤでもそれを行うことができます。私は列名を取得することができると考えていたし、そのデータを使用してテーブルをクエリするのは、基本的に動的なselect文を作成することです。 – TheSnooker

+0

これは動的SQL(実質的に2つのクエリ)で行うことができますが、すべての列を必要としない場合は、メタデータの列を選択するクエリをコーディングして、列を含める基準(そして、あなたが望む特定の注文)。ただし、メタデータのクエリの結果を選択クエリの選択リストに直接変換することはできません。 –

答えて

2

このSQLFiddleを試してみてくださいする必要はありません飽きエラーを得ることはありません:

CREATE TABLE atable (
    prefix1 VARCHAR(10) 
    ,prefix2 VARCHAR(10) 
    ,notprefix3 INT 
    ,notprefix4 INT 
); 

INSERT INTO atable VALUES ('qwer qwer', 'qwerqwer', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'asdfaasd', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'qrt vbb', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'sdfg sdg', 1, 1); 

SELECT CONCAT('SELECT ', GROUP_CONCAT(c.COLUMN_NAME), ' FROM atable;') 
INTO @query 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME = 'atable' 
    AND c.COLUMN_NAME LIKE 'prefix%' 
ORDER BY c.ORDINAL_POSITION; 

PREPARE stmt FROM @query; 

EXECUTE stmt; 

いくつかの問題:

あなたはおそらく、あなたの結果セット上のORDER BYのいくつかの種類をお勧めします。

ジョインと物事の面でできることには限界があります。

検証をテストによって失われる可能性が高いランタイムに移動します。

スキーマの変更を簡単に処理できるようにしたいと考えています。この手法では、特定のタイプのスキーマの変更のみを処理しますが、他のものはおそらくこのコードを変更する必要があります。

+0

ええ、私はあなたが何を意味するかを見ます。私は、私が定義し変更できる一連のルールに基づいて特定の列を取得するだけのインテリジェントなクエリシステムを作成できることを期待していました。このアプローチをもっと見ると、より複雑になる可能性があることが分かります。私はCONCATを使うことは決して考えなかった。 – TheSnooker

+0

@Snookerコード生成と動的SQLは、システムの保守を容易にするための場所を持っています。実際、コード生成とデータベースコードの正常性監視にメタデータを使用することについてのプレゼンテーションがあります。しかし、私はこの特定のシナリオを将来的に証明するために特別な場所がないとは思わない。 –

関連する問題