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

标签 mysql sql database mysql-python

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

编辑:
好吧,很显然,在 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 规则 1 示例 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) 结尾:您的 SQL 语法有错误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1 行的“NULL”附近使用的正确语法

但是,如果我删除 INTO colAvg 部分并执行 SELECT @QUERY:= CONCAT('SELECT AVG(',@M,') FROM DemoTable');
它完全将答案打印到屏幕上。我需要将其返回给 colAvg。 我究竟做错了什么?

好吧!我让程序正常工作! 我现在遇到了另一个问题。 将值从我的函数返回到过程时出现错误。
它说函数内部不允许使用动态 sql。
但是我在程序中使用了动态 sql :S
这里发生了什么?!
我最终需要的是:
从 DemoTable 中选择位置 No_of_Hospitals > AvgCity(No_of_Hospitals)

有人可以为此设立一个小额赏金吗?我已经一个多星期没有得到一个单一的答案了。 :(

最佳答案

我会简单地将整个查询放在一个字符串中(使用 concat,包括表名)并执行。

关于mysql - 如何将动态列名传递给 MySql 中的函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694218/

相关文章:

mysql - Cakephp 查找 ('list' ) 与汇总数据返回空值

php - 根据同一个表的查询更新表

database - 如何查找所有房地产列表数据?

javascript - 如何将 json 数据添加到由 long 和 lat 组成的数组中?

mysql - Mariadb 5.5 比 MySQL 5.1 慢

用于更改所有存储过程中的所有表引用的 SQL 脚本

database - 多次使用 Test::MockDBI 得到不同的结果

node.js - 如何为 REST API 构建 Mongo 数据库

java - 如何用 Spring + Hibernate + MySQL 实现搜索过滤器?

mysql - NodeJS JSON 到 SQL 和 SQL 到 JSON 库?