2015-02-24 68 views
2

好吧,我現在只想找一份工作。有人能指導我嗎?如何將動態列名稱傳遞給MySql中的函數參數?

編輯:
好了,所以apparantly有沒有辦法讓一個函數來調用MySQL中的動態過程。
但我真的需要動態地做這個select語句!

SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals) 

或者找到一個更好的方法來處理這個問題。 AvgCity()中的參數始終是動態的。這是強制性的。參數傳遞將是DemoTable中列的名稱。 我需要一種有效的方式來處理規則表和DemoTable中的規則,如下所述。 現在已經3天了,我一直在這一點上。 幫助! :s

作爲參考,這裏是我遇到的老問題。一切的流程,我已經得到這樣做的遠

老問題:
能有人幫我出了一個好辦法去了解呢? 我是MySql的新手,我無法在任何地方找到簡單的答案。
我有兩個表,我正在與。第一個表包含了很多諸如充滿整數值列:

No_of_Hotels No_of_Hospitals 

第二個表是一個規則表包含規則名稱後面跟着實際的規則。
如:

ID RuleName Rule 1 Example No_of_Hospitals > AvgCity(No_of_Hospitals)

,我現在所擁有的功能是:

CREATE FUNCTION AvgCity(columnName text) RETURNS float(10) 
DETERMINISTIC 
BEGIN 
DECLARE columnAvg float; 
SELECT AVG(columnName) 
INTO columnAvg 
FROM DemoTable; 
RETURN (columnAvg); 
END 

但每次我一值傳遞給函數參數的時間 - 這是一個列的名字我想要的平均數,我得到一個0作爲回報。
我想這是因爲傳遞給AVG()函數的參數作爲字符串而不是列名傳遞。 那麼這就是AVG("No_of_Hospitals")而不是AVG(No_of_Hospitals),它也會返回0
如何解決此問題並獲得結果?

我會結果後執行整個事情:

SELECT @Q:= CONCAT('SELECT Location FROM DemoTable WHERE ', Rules.Rule) FROM 
Rules  WHERE ID=1; 
PREPARE stq FROM @Q; 
EXECUTE stq; 
DEALLOCATE PREPARE stq; 

這一切都在SELECT語句的話,我確實需要AvgCity()是一個功能,而不是一個過程。

UPDATE 1:
所以我決定把一個程序放在函數裏面。
什麼,我現在是這樣的功能:

CREATE FUNCTION AvgCity(colName text) RETURNS float(10) 
DETERMINISTIC 
BEGIN 
DECLARE colAvg float; 
CALL AvgCityProcedure(colName,colAvg); 
RETURN (colAvg); 
END  

並且這個過程:

CREATE PROCEDURE AvgCityProcedure(
IN colName VARCHAR(100), 
OUT colAvg FLOAT) 
BEGIN 
SET @c1 = 0.0; 
SET @M:= colName; 
SET @QUERY:= CONCAT('SELECT AVG(',@M,') INTO @C1 FROM DemoTable'); 
PREPARE stmt FROM @QUERY; 
EXECUTE stmt; 
SET colAvg:[email protected]; 
SELECT colAvg; 
END 

更新2:我的程序工作!
遵循這個非常好的例子:
My SQL Dynamic query execute and get ouput into a variable in stored procedure
但我似乎無法管理到裏面插入colAvg任何價值。 我試了很多與@QUERY的組合,但我找不到合適的組合。 我跟上ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1

結束了,但如果我刪除INTO colAvg一部分,只是做 SELECT @QUERY:= CONCAT('SELECT AVG(',@M,') FROM DemoTable');
它完全打印答案畫面。我需要將其返回colAvg。 我在做什麼錯?

好吧!我的程序正常工作! 我現在又遇到了另一個問題。 從我的函數返回值到過程時出現錯誤。
它說功能裏面不允許動態sql。
但我用我的程序中的動態SQL:S
這裏發生了什麼?!
我需要它看起來像到底是:
SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals)

可能有人請建立一個小型的賞金對此有何看法?我現在還沒有在一個多星期內得到答案。 :(

+1

有步驟更換你的函數 – Mihai 2015-02-28 12:31:31

+0

但我不能在SELECT語句中使用的過程。?小號 – MetalloyD 2015-02-28 12:34:47

回答

0

我就乾脆把整個查詢字符串中(與CONCAT,包括表名),並執行

相關問題