首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL从变量中选择列名

MySQL从变量中选择列名
EN

Stack Overflow用户
提问于 2015-09-17 18:29:20
回答 2查看 979关注 0票数 0

我有一个触发器,它将case语句的值存储在变量@SHIFTIME中,通过返回值Shift1、Shift2或Shift3可以很好地工作。现在,我需要在引用列名的select语句中使用该变量的结果。我尝试将其存储在变量@SHIFTSELECT中:

代码语言:javascript
复制
  SET @SHIFTSELECT := (SELECT @SHIFTIME FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME); 

因此@SHIFTIME是列名,我希望@SHIFTSELECT将其解释为:

代码语言:javascript
复制
SELECT `Shift1` FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME

但问题是@SHIFTSELECT返回与@SHIFTIME相同的值,即列名(Shift1、Shift2或Shift3),而不是所需的行结果。这是我的完整触发器:

代码语言:javascript
复制
CREATE TRIGGER `oee_upd_final` AFTER INSERT ON `oee_main_interim`
 FOR EACH ROW BEGIN
DECLARE SHIFTIME TEXT;
DECLARE SHIFTSELECT TEXT;
SET @SHIFTIME := ( Select 

      (Case
        When ((CurTime() > oee_machinenames.Shift1) And
        (CurTime() < oee_machinenames.Shift2)) Then 'Shift1'
        When ((CurTime() > oee_machinenames.Shift2) And
        (CurTime() < oee_machinenames.Shift3)) Then 'Shift2'
        When ((CurTime() > oee_machinenames.Shift3) Or
        (CurTime() < oee_machinenames.Shift1)) Then 'Shift3' End) 
    From
      oee_machinenames
      where 
      oee_machinenames.ID = New.NAME

    Group By
      oee_machinenames.ID);

 SET @SHIFTSELECT := (SELECT @SHIFTIME FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME); 


INSERT INTO `oee_main_interim_final` (id,NAME,ts,Left_IO,Left_NIO,Recovery,Right_IO,
Right_NIO,RunMode,S_TYPE,Shift,STD,curr_S_Type,Reporting_Date, Shift_TS) 
VALUES(NULL, New.NAME, New.TS, NEW.Left_IO, New.Left_NIO,  New.Recovery, New.Right_IO, New.Right_NIO, New.RunMode, New.S_TYPE, 


 (select @SHIFTIME),

  (Select
    `STD` From `oee_variant` Where `Machine_ID` = New.NAME And `S_TYPE` = 

(Select
  `S_TYPE`

From
  `v_getmaxid`
Where
  `NAME` = New.Name And
  v_getmaxid.Max_id In (Select
    Max(v_getmaxid.Max_id) As Max_Max_id
  From
    `v_getmaxid`
  Where
    `NAME` = New.Name))

     And `oee_variant`.`Operators` = 
    (Select `Operators` from `oee_machinenames` where `ID` = New.NAME)),


(Select
  `S_TYPE`

From
  `v_getmaxid`
Where
  `NAME` = New.Name And
  v_getmaxid.Max_id In (Select
    Max(v_getmaxid.Max_id) As Max_Max_id
  From
    `v_getmaxid`
  Where
    `NAME` = New.Name)),

(select((case when (((@SHIFTIME = 'Shift3') and 
  (cast(New.TS as time) >= '00:00:01')) 
or (cast(New.TS as time) <= '05:59:00')) 
then (New.TS - interval 1 day) else cast(New.TS as date) end)) AS Reporting_Date),

(SELECT @SHIFTSELECT)

        );
        END
EN

回答 2

Stack Overflow用户

发布于 2015-09-17 18:34:30

不,您不能将列名用作变量,除非它是一个动态查询(或)您在应用程序代码中创建它。动态查询方式如下所示

代码语言:javascript
复制
SET @sql = CONCAT("SELECT ", @SHIFTIME," FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME");
 PREPARE stmt FROM @sql;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;

然后将预准备语句更改为

代码语言:javascript
复制
SET @result = '';
SET @sql = CONCAT("SELECT ? INTO @result FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME");
 PREPARE stmt FROM @sql;
 EXECUTE stmt  USING @SHIFTIME;
SELECT @result; // Set the data to some other variable
 DEALLOCATE PREPARE stmt;

编辑:啊!!我没注意到这是个引爆器。我在想这是一个程序。是的,你不能但是你的查询get @SHIFTIME和SET @SHIFTSELECT := ...这两个部分可以组合成一个修改后的查询,如下所示,所以不需要动态查询。

代码语言:javascript
复制
Select 

      (Case
        When ((CurTime() > oee_machinenames.Shift1) And
        (CurTime() < oee_machinenames.Shift2)) Then oee_machinenames.Shift1
        When ((CurTime() > oee_machinenames.Shift2) And
        (CurTime() < oee_machinenames.Shift3)) Then oee_machinenames.Shift2
        When ((CurTime() > oee_machinenames.Shift3) Or
        (CurTime() < oee_machinenames.Shift1)) Then oee_machinenames.Shift3 End) 
    From
      oee_machinenames
      where oee_machinenames.ID = New.NAME

    Group By
      oee_machinenames.ID);
票数 2
EN

Stack Overflow用户

发布于 2015-09-17 18:45:01

你可以按照下面的方法使用-

代码语言:javascript
复制
SET @qry = CONCAT('SELECT ',@SHIFTIME,' INTO @SHIFTSELECT FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME');
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32628133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档