- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
好的,我现在只是在找工作。有人可以指导我吗?
编辑:
好吧,很显然,在 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/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!