如何将动态列名称传递给MySql中的函数参数?

时间:2015-02-24 11:09:38

标签: mysql sql database mysql-python

好的,我现在只想找个工作。有人可以指导我吗?

修改
好吧,很明显,没有办法在MySql中调用动态程序 但我真的需要动态地做这个select语句!

SELECT Location FROM DemoTable WHERE No_of_Hospitals > AvgCity(No_of_Hospitals)

或者找到更好的方法来解决这个问题。 AvgCity()中的参数将始终是动态的。那是强制性的。参数传递将是DemoTable中列的名称。 我需要一种有效的方法来处理规则表和DemoTable中的规则,如下所述。 现在已经3天了,我一直坚持这个。 帮助!! :■

作为参考,这是我遇到的老问题。到目前为止我所做的一切都在流动 -

旧问题:
有人可以帮我解决这个问题吗? 我是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: 我的程序正常运作!
跟着这个非常好的例子:
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 个答案:

答案 0 :(得分:0)

我只是将整个查询放在一个字符串中(带有concat,包括表名)并执行。