2009-06-12 11 views
10

私は列名の最初の部分が文字列であり、2番目の部分が別のクエリの結果であるような方法で列名を連結したいと思います。例えばクエリで使用する列名を作成するMySQL concat()?

SELECT CONCAT('column', mytable.mycolumn) FROM table ... 

は、これはいくつかの方法で行うことができます。この方法ではエラーは出ませんが、期待した結果が得られず、連結が機能しないようです。

+0

私は...あなたはCONCATの内側に別のSELECTを使用することができると思います、そうでなければ、ストアドプロシージャを作成する必要があります。テストするためにここにMysQLを持っていないので、答えの代わりにコメントしてください。 – TimothyP

答えて

22

でTABLE_TYPEを使用し、私は以前にこれを行うことができませんでしたが、私は間違っていたと言いました。私はこのようなものを自分で必要とすることになりました。server-side prepared statementsは、文字列から任意のSQL文を構築して実行できることを発見しました。ここで

は、私はちょうど概念を証明するためにやった例です:あなたは簡単に以下のクエリを使用することができます

set @query := (
    select concat(
    "select", 
     group_concat(concat("\n 1 as ", column_name) separator ','), 
    "\nfrom dual") 
    from information_schema.columns 
    where table_name = 'columns') 
; 
prepare s1 from @query 
; 
execute s1 
; 
deallocate prepare s1 
; 
+0

私はそれが事実だと思うし、私は1つのクエリで欲しいものを実行できないことを受け入れる必要があります。 – markus

+0

@tharkun私は私の答えを逆転させた。ドキュメントによると、この機能にはMySQLのバージョン5.0以上が必要です。 –

2

CONCAT()CONCAT_WS()でこれを行うことはできません。私はあなたがフィールド名を作成する作業中のlangaugeを使用することをお勧めしたいと思います。このようにすると、データベースのデータがどこに由来しているかによって、恐ろしいことになります。

+0

あなたは恐ろしいことを詳述できますか?連結するデータはauto_incremented ID(プライマリ)です。 – markus

+0

あなたの質問を改訂してください。使用している番号がauto_incremented IDの場合、テーブルにいくつの列があると思われますか?私はこのテーブルが "column1"、 "column2、...、" column90000 "のような列を持たないことを願っているので、私はこの質問を理解していないと思う。 – Arjan

+0

すべての質問にIDがあり、そのIDが列名に含まれています – markus

12

列の数が固定されている場合は、非動的なアプローチが考えられます。

select 
    case mytable.mycolumn 
    when 1 then column1 -- or: when 'a' then columna 
    when 2 then column2 
    when ... 
    else ... 
    end as my_semi_dynamic_column 
from ... 
+0

感謝します。それは完全に汎用的でなければならないので動作しません。 – markus

+0

もう一度あなたの質問を読んで、私はあなたが数字を使用して参照してください。だから、私は "when 'a' then columna"を "when 1 then column1"に変更しました。あなたのテーブルの 'columnxx'列の数は本当に高いですか...? – Arjan

+0

はい、それはかなり高く、変更されています。だから私は動的で汎用的なものが必要です。 – markus

0

私はinformation_schemaを見てお勧めします。次のコードはテストされていませんが、理論的には動作するはずです。明らかにINFORMATION_SCHEMA.TABLESに適切なテーブル名またはリンクを使用して、テーブル名を交換し、あなたのwhere句

select concat('column', column_name) from information_schema.columns where table_name ='your table name' 
+0

それが別の方法ではうまくいかない場合、なぜそれがinformation_schemaの選択のために働かなければならないのですか? – markus

+0

これは、列の内容(動的である)の内容ではなく、列名をフェッチします。 – Arjan

+0

はい、意味があります、ヒントのおかげで!私はすでにこれを今試しています... – markus

-1

SELECT group_concat(COLUMN_NAME) FROM information_schema.columns WHERE table_name ='your table name'; 
関連する問題