2015-02-24 39 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,包括表名),并执行

相关问题