私は列名の最初の部分が文字列であり、2番目の部分が別のクエリの結果であるような方法で列名を連結したいと思います。例えばクエリで使用する列名を作成するMySQL concat()?
:
SELECT CONCAT('column', mytable.mycolumn) FROM table ...
は、これはいくつかの方法で行うことができます。この方法ではエラーは出ませんが、期待した結果が得られず、連結が機能しないようです。
私は列名の最初の部分が文字列であり、2番目の部分が別のクエリの結果であるような方法で列名を連結したいと思います。例えばクエリで使用する列名を作成するMySQL concat()?
:
SELECT CONCAT('column', mytable.mycolumn) FROM table ...
は、これはいくつかの方法で行うことができます。この方法ではエラーは出ませんが、期待した結果が得られず、連結が機能しないようです。
で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
;
私はそれが事実だと思うし、私は1つのクエリで欲しいものを実行できないことを受け入れる必要があります。 – markus
@tharkun私は私の答えを逆転させた。ドキュメントによると、この機能にはMySQLのバージョン5.0以上が必要です。 –
CONCAT()
とCONCAT_WS()
でこれを行うことはできません。私はあなたがフィールド名を作成する作業中のlangaugeを使用することをお勧めしたいと思います。このようにすると、データベースのデータがどこに由来しているかによって、恐ろしいことになります。
列の数が固定されている場合は、非動的なアプローチが考えられます。
は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 ...
私はinformation_schemaを見てお勧めします。次のコードはテストされていませんが、理論的には動作するはずです。明らかにINFORMATION_SCHEMA.TABLESに適切なテーブル名またはリンクを使用して、テーブル名を交換し、あなたのwhere句
select concat('column', column_name) from information_schema.columns where table_name ='your table name'
:
SELECT group_concat(COLUMN_NAME) FROM information_schema.columns WHERE table_name ='your table name';
私は...あなたはCONCATの内側に別のSELECTを使用することができると思います、そうでなければ、ストアドプロシージャを作成する必要があります。テストするためにここにMysQLを持っていないので、答えの代わりにコメントしてください。 – TimothyP