gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:54:30 25 4
gpt4 key购买 nike

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

编辑:
好吧,很显然,在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com