2016-01-21 41 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