2016-01-21 40 views
1

我目前正在写MySQL中的功能,需要我能够做到以下类似的东西:MySql,结合变量来使变量的名称?

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

正如你可以在上面看到,我试图Concat的“piv.x”和变量argNumber的值来创建piv.x2,这是表中的一列。我遇到的问题是,我使用concat函数后,该过程将结果字符串视为数据而不是作为参考。我怎样才能解决这个问题?

回答

0

它应该是(假设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; 
+0

我认为@testingturing试图使用concat编写字段名称 – genespos

+0

它仍然没有运行。我目前正在测试以外的程序,所以我已经使用SELECT @argNumber:= 2声明了argnumber,所以也许这是为什么? – TestingTuring

+0

@TestingTuring,看起来像你需要一个动态查询。如果有帮助,请参阅编辑答案。 – Rahul

0

您需要创建动态SQL与PREPARE

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。

+0

在我的情况下,我将从一个过程中调用这个语句,我将为该语句的结果设置一个变量。还有什么我应该知道使用准备声明? – TestingTuring

+0

它不适合我。 concat之后是否有括号的理由? – TestingTuring

+0

'CONCAT'是一个函数,圆括号包含了应该连接的参数。 – Barmar