2009-06-12 1 views
10

Я хотел бы объединить имена столбцов так, чтобы первая часть имени столбца была строкой, а вторая часть - числом, которое является результатом другого запроса.MySQL concat() для создания имен столбцов, которые будут использоваться в запросе?

Например:

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

Может ли это быть сделано в некотором роде. Таким образом, это не дает мне ошибок, но я не получаю ожидаемого результата, и кажется, что конкатенация не работает.

+0

Я думаю, что ... Вы можете использовать другой ВЫБРАТЬ внутри CONCAT , если нет, вам придется создать хранимую процедуру. У меня нет MysQL для тестирования, поэтому вместо ответа ответьте. – TimothyP

ответ

22

Я ранее говорил, что это не могло быть сделано, но я был неправ. Мне в конечном итоге нужно что-то подобное, поэтому я осмотрелся и обнаружил, что 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

Я думаю, что это так, и я должен признать, что я не могу делать то, что хочу в одном запросе, так же хорошо, как и было бы. – markus

+0

@tharkun Я отменил свой ответ. Обратите внимание, что в соответствии с документацией эта функция требует как минимум версии 5.0 MySQL. –

2

Я не верю, что вы можете сделать это с помощью CONCAT() и CONCAT_WS(). Я бы рекомендовал использовать langauge, с которым вы работаете, для создания имен полей. Выполнение этого способа было бы довольно страшным, в зависимости от того, откуда взялись данные в базе данных.

+0

Не могли бы вы рассказать о страхе? данные для конкатенации - это идентификатор auto_incremented (первичный). – markus

+0

Пожалуйста, внесите изменения в свой вопрос. Если номер, который вы используете, является идентификатором auto_incremented, то сколько столбцов вы ожидаете иметь в своей таблице? Думаю, я не понимаю вопроса, так как надеюсь, что в этой таблице нет столбцов, таких как «column1», «column2», «...», «column90000», ... – Arjan

+0

вид, но не совсем. единичные вопросы, один пользователь в строке, поэтому это результат набора результатов опроса. Каждый вопрос имеет идентификатор, и этот идентификатор включен в имя столбца. – 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

Повторяя ваш вопрос, я вижу, вы используете цифры. Итак, я изменил «когда» a «then columna» в «когда 1, затем столбец 1». Является ли число столбцов «columnxx» в вашей таблице таким высоким ...? – Arjan

+0

Да, он довольно высокий, и он меняется.поэтому мне нужно что-то динамичное и универсальное. – markus

0

Я предлагаю смотреть на information_schema. Следующий код непроверен, но должен теоретически работать. Очевидно заменить имя таблицы с соответствующим именем таблицы или ссылки на INFORMATION_SCHEMA.TABLES и использовать TABLE_TYPE в вашем где п

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'; 
Смежные вопросы