【问题标题】:MySql, combining variables to make the name of a variable?MySql,组合变量来命名变量?
【发布时间】:2016-04-28 08:29:03
【问题描述】:

我目前正在 MySql 中编写一个函数,要求我能够执行以下操作:

 SET argNumber = 2;
 SELECT x.x_id 
   FROM x, piv
  WHERE x.x_id = concat('piv.x', argNumber)
  LIMIT 1;

正如您在上面看到的,我正在尝试连接“piv.x”和 argNumber 的变量值来创建 piv.x2,它是表 piv 中的一列。我遇到的问题是,在我使用 concat 函数后,该过程将生成的字符串视为数据而不是参考。我该如何解决这个问题?

【问题讨论】:

    标签: mysql variables join reference concatenation


    【解决方案1】:

    你需要用PREPARE创建动态SQL:

    SET argNumber = 2;
    PREPARE stmt FROM CONCAT('
        SELECT x.x_id 
        FROM x, piv
        WHERE x.x_id = piv.x', argNumber, '
        LIMIT 1');
    EXECUTE stmt;
    

    要将SELECT 的结果放入变量中,您可以在语句中赋值给变量,如下所述:

    How to get scalar result from prepared statement?

    PREPARE stmt FROM CONCAT('
        SELECT @id := x.x_id 
        FROM x, piv
        WHERE x.x_id = piv.x', argNumber, '
        LIMIT 1');
    

    执行语句后,变量@id 包含选定的ID。

    【讨论】:

    • 在我的情况下,我将从过程内部调用此语句,并将变量设置为该 select 语句的结果。关于使用 prepare 语句还有什么我应该知道的吗?
    • 它不适合我。 concat后的括号有原因吗?
    • CONCAT 是一个函数,括号中包含应该连接的参数。
    • @TestingTuring 请参阅stackoverflow.com/questions/3992454/… 了解如何获取语句的结果。
    【解决方案2】:

    应该是(假设 piv.xvarchar 列,否则您需要先将其转换为正确的类型)

    concat(piv.x, '2')
    

    您的查询应该是这样的

     SELECT x.x_id 
     FROM x JOIN piv
      ON x.x_id = concat( CAST(piv.x AS VARCHAR), argNumber)
      LIMIT 1;
    

    根据您的评论,您似乎需要动态查询。然后像下面那样做

    SET @sql =CONCAT("SELECT x.x_id FROM x JOIN piv ON x.x_id = piv.x", argNumber, " LIMIT 1");
     PREPARE stmt FROM @sql;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;
    

    【讨论】:

    • 我认为@testingturing 正在尝试使用 concat 来组成字段名称
    • 它仍然没有为我运行。我目前正在我的程序之外进行测试,所以我已经使用 SELECT @argNumber : = 2 声明了 argnumber,所以也许这就是原因?
    • @TestingTuring,看来您需要动态查询。如果有帮助,请参阅答案中的编辑。
    • @genespos,是的,他的最新编辑使我的回答无效。立即查看编辑。
    • 我对 prepare 语句的工作方式有点困惑。看起来它接受了它前面的内容,连接它,并将其视为手写输入。那么我也可以使用 Prepare stmt FROM 'my select statement', variable a, variable b, etc, 'more of the select statement',我应该得到与你发布的结果相同的结果,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2015-03-15
    • 2021-06-22
    相关资源
    最近更新 更多