[英]How to pass a Dynamic column name to a function parameter in MySql?
好的,我現在只是在尋找工作。 有人可以指導我嗎?
編輯:
好的,因此顯然沒有辦法在MySql中獲得函數來調用動態過程。
但是我真的需要動態地執行此select語句!
SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals)
或者找到一種更好的方法來處理此問題。 AvgCity()中的參數將始終保持動態。 這是強制性的。 傳遞的參數將是DemoTable中列的名稱。 我需要一種有效的方法來處理規則表和DemoTable中的規則,如下所述。 現在已經三天了,我一直堅持下去。 救命!! :s
供參考,這是我遇到的老問題。 到目前為止,我所完成的所有工作都順其自然,
舊問題:
有人可以幫我解決這個問題的好方法嗎? 我是MySql的新手,我似乎在任何地方都找不到簡單的答案。
我有兩個正在使用的表。 第一個表包含許多用Integer值填充的列,例如:
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()
作為函數而不是過程。
更新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:=@C1;
SELECT colAvg;
END
更新2: 我使程序正常工作!
遵循了這個非常好的示例:
我的SQL動態查詢執行並輸出到存儲過程中的變量中
但是我似乎無法設法在 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
結尾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
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)
有人可以為此設置一個小小的賞金嗎? 現在有一個多星期了,我沒有一個答案。 :(
我只是將整個查詢放在一個字符串中(使用concat,包括表名)並執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.