2016-11-15 53 views
0

當選擇一個MySQL變量,它包含select語句的級聯和像這樣另一個變量:的MySQL變量內容

SET @sql_q1 := (CONCAT('(SELECT "Q1" AS quartile, 
visit.id FROM carecube.visit order by visit.id LIMIT 1 OFFSET ', @var, ')')); 

爲什麼是這樣,當我選擇這個,爲什麼它返回的SELECT語句作爲文本,而比價值?

謝謝。

編輯:當我運行下面的SELECT語句來選擇變量,它只是打印變量中的SELECT語句,並打印出

「SELECT‘Q1’AS四分, visit.id FROM carecube.visit order by visit.id LIMIT 1 OFFSET 58'

我想我會得到一個返回的數字,抵消後第58行,而不是文本。

+1

您使用的是MySQL還是MS SQL Server?不要標記不涉及的產品。 – jarlh

+1

你是什麼意思「當我選擇這個」?你**選擇** @ sql_q1或執行語句? – FDavidov

+0

@jarlh,'MySQL'是DBMS,'sql'是語言。沒有衝突。 – FDavidov

回答

1

您在變量(@sql_q1)中生成一個字符串。順便提一句,你的字符串是一個MySQL查詢,但這並沒有以任何方式使它變得特別。

當您運行SELECT @sql_q1;時,您將獲得變量(字符串)的內容,而不是其他任何東西。

爲了告訴MySQL將該變量的內容(即字符串)解釋爲查詢,您可以將其用作prepared statement

# Generate the query in a variable 
SET @sql_q1 := CONCAT(
    'SELECT "Q1" AS quartile, visit.id FROM carecube.visit order by visit.id LIMIT 1 OFFSET ', 
    @var 
); 

# Use the content of the variable to create a prepared statement 
PREPARE stmt1 FROM @sql_q1; 

# Run the prepared statement 
EXECUTE stmt1; 

# Cleanup 
DEALLOCATE PREPARE stmt1; 

您甚至不需要生成固定查詢;您可以在EXECUTE聲明中使用佔位符值來爲它們提供值:

SET @sql_q2 := 'SELECT "Q1" AS quartile, visit.id FROM carecube.visit order by visit.id LIMIT 1 OFFSET ?'; 
PREPARE stmt2 FROM @sql_q2; 
EXECUTE stmt2 USING @var; 
DEALLOCATE PREPARE stmt2;