17

我想以一种方式连接列名,即列名的第一部分是一个字符串,第二部分是一个数字,它是另一个查询的结果。

例如:

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

这可以以某种方式完成。这样它不会给我错误,但我没有得到预期的结果,而且连接似乎不起作用。

4

4 回答 4

27

我之前说过这不能做,但我错了。我最终自己也需要这样的东西,所以我环顾四周,发现服务器端准备好的语句允许您从字符串构建和执行任意 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
;
于 2009-06-12T10:57:29.267 回答
14

如果列数是固定的,那么非动态方法可能是:

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 ...
于 2009-06-12T09:47:56.623 回答
3

我不相信你可以用CONCAT()and做到这一点CONCAT_WS()。我建议使用您正在使用的语言来创建字段名称。这样做会非常可怕,具体取决于数据库中的数据来自何处。

于 2009-06-12T09:41:42.427 回答
0

我建议查看information_schema。以下代码未经测试,但理论上应该可以工作。显然用适当的表名替换您的表名或链接到 information_schema.tables 并在 where 子句中使用 table_type

select concat('column', column_name) from information_schema.columns where table_name ='your table name'
于 2009-06-12T09:54:59.773 回答