簡體   English   中英

如何在MySQL中將動態列名傳遞給函數參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM