MySQL变量值作为选择子句中的列

时间:2018-11-28 21:22:06

标签: mysql

我通过下面的select查询输出分配一个变量。

 select group_concat(COLUMN_NAME) 
  from 
    ( select  distinct COLUMN_NAME 
       FROM information_schema.`COLUMNS` C  
     WHERE table_name = 'ADM_METERQUEUE' 
        AND COLUMN_NAME LIKE '%maxrate%' 
      order 
         by 1 desc 
      limit 5) as ids 
  INTO @COLUMNS

已分配变量的输出如下所示。

select @COLUMNS

o / p :: maxrate23,maxrate22,maxrate21,maxrate20,maxrate19

当我在select子句中使用时,我将变得如下所示。

select @COLUMNS from ADM_METERQUEUE where meterqueueid=38

o / p :: maxrate23,maxrate22,maxrate21,maxrate20,maxrate19

我想实现以下目标,请让我知道该怎么做。

所需的输出::

select maxrate23,maxrate22,maxrate21,maxrate20,maxrate19 from ADM_METERQUEUE where meterqueueid=38;

+-----------+-----------+-----------+-----------+-----------+
| maxrate23 | maxrate22 | maxrate21 | maxrate20 | maxrate19 |
+-----------+-----------+-----------+-----------+-----------+
|       2   |   7       |  4        |    4      |  1        |
+-----------+-----------+-----------+-----------+-----------+

select group_concat(COLUMN_NAME)    from      ( select  distinct COLUMN_NAME         FROM information_schema.`COLUMNS` C        WHERE table_name = 'ADM_METERQUEUE'          AND COLUMN_NAME LIKE '%maxrate%'        order           by 1 desc        limit 5) as ids    INTO @COLUMNS;

PREPARE stmt FROM 'select ? from ADM_METERQUEUE';

 EXECUTE stmt USING @COLUMNS;

o / p :: maxrate23,maxrate22,maxrate21,maxrate20,maxrate19

仍然我得到与输出相同的列名 服务器版本:5.6.37-82.2-56-log Percona XtraDB群集(GPL),版本rel82.2,修订版114f2f2,WSREP版本26.21,wsrep_26.21

1 个答案:

答案 0 :(得分:0)

您已经很近了,但是docs的这一部分应该可以完整显示图片

  

语句名称不区分大小写。 preparable_stmt是   字符串文字或包含SQL文本的用户变量   声明。文本必须代表一个声明,而不是多个   陈述。在语句中,?字符可以用作   参数标记,用于指示将数据值绑定到哪里   稍后在执行时查询。 ?字符不应该   括在引号中,即使您打算将其绑定到   字符串值。 参数标记仅可用于数据值   应该出现,而不是用于SQL关键字,标识符等

换句话说,您可以将诸如meterqueueid之类的数据值用作绑定变量,但不能使用@COLUMNS中收集的列标识符。

假设meterqueueid也来自另一个变量,那么类似的事情应该起作用

SET @mqid = 38;
SET @sql = CONCAT('SELECT ', @COLUMNS, ' FROM ADM_METERQUEUE where meterqueueid=?');

PREPARE stmt FROM @sql;
EXECUTE stmt USING @mqid;
DEALLOCATE PREPARE stmt;