MySQL concat () для создания имен столбцов, которые будут использоваться в запросе? - PullRequest
11 голосов
/ 12 июня 2009

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

Например:

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

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

Ответы [ 5 ]

23 голосов
/ 12 июня 2009

Ранее я говорил, что этого нельзя сделать, но я ошибался. Мне в конечном итоге понадобилось что-то подобное, поэтому я оглянулся и обнаружил, что подготовленные операторы на стороне сервера позволяют создавать и выполнять произвольные операторы 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
;
12 голосов
/ 12 июня 2009

Если число столбцов фиксировано, то нединамический подход может быть:

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 ...
3 голосов
/ 12 июня 2009

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

0 голосов
/ 15 июля 2016

Вы можете легко использовать следующий запрос:

SELECT group_concat( COLUMN_NAME) FROM information_schema.columns WHERE table_name ='your table name';
0 голосов
/ 12 июня 2009

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

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