MySQL concat () для создания имен столбцов, которые будут использоваться в запросе?
Я хотел бы объединить имена столбцов таким образом, что первая часть имени столбца строки и вторая часть-это число, которое является результатом другого запроса.
например:
SELECT CONCAT('column', mytable.mycolumn) FROM table ...
можно ли это сделать каким-то образом. Таким образом, это не дает мне ошибок, но я не получаю ожидаемого результата, и кажется, что конкатенация не работает.
5 ответов
Я ранее говорил, что это невозможно сделать, но я ошибался. Мне самому понадобилось что-то подобное, поэтому я огляделся и обнаружил, что на стороне сервера подготовленные операторы позволяет создавать и выполнять произвольные операторы 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
;
Если количество столбцов фиксировано, то нединамический подход может быть:
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 ...
Я не верю, что вы можете сделать это с помощью CONCAT()
и CONCAT_WS()
. Я бы рекомендовал использовать langauge, с которым вы работаете, чтобы создать имена полей. Делать это таким образом было бы довольно страшно, в зависимости от того, откуда пришли данные в базе данных.
Я бы предложил посмотреть на information_schema для. Следующий код непроверен, но теоретически должен работать. Очевидно, замените имя таблицы соответствующим именем таблицы или ссылкой на information_schema.таблицы и используйте table_type в предложении 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';