我正在使用MySQL存储函数,我创建了一个函数,并且我已将列名作为参数传递给此函数。假设
CREATE DEFINER=`root`@`localhost` FUNCTION `test_func`(column_1 varchar(100)) RETURNS varchar(100) CHARSET latin1
select column_1 from table where id = 1 ;
在这里,我想获得列' column_1'的值。 id为1.但是我得到的列名本身并不是值。
请帮我写出正确的语法。
答案 0 :(得分:3)
您的方法存在一些问题。首先,您不能使用您的参数 value 来引用基础列。好的是,您可以使用Prepared Statements作为解决方法。
第二个问题是MySQL功能不允许使用Prepared Statements。要解决该限制,您需要使用存储过程。举个例子:
CREATE PROCEDURE test_func (IN col1 varchar(100), OUT res int)
BEGIN
SET @s=CONCAT('SELECT ',col1,' INTO @res FROM yourtable WHERE id=1');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SELECT @res INTO res;
END
答案 1 :(得分:1)
经过长时间的搜索后,我发现存储的函数只能用于返回单个值或计算出的答案(算术)。对于您的查询,只需使用存储过程。它就像从前端创建查询一样简单。这是语法:
使用CONCAT(X1,X2,X3 . . .)
按您的意愿执行此操作。
CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(table longtext,column longtext,e_id longtext)
SET @s=CONCAT('Select ',table,' from ', column, 'Where employee = ',e_id);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
答案 2 :(得分:0)
我不确定你要问的是什么。但是这是一个使用预备语句的解决方案:
SET @selectStatement = CONCAT('Select ', columnName1,' from tab1 where id = 1'); -- Build Select statement like this
PREPARE stmt FROM @selectStatement; -- parse and prepare insert statement from the above string
EXECUTE stmt; -- execute statement
DEALLOCATE PREPARE stmt; -- release the statement memory.
我不知道完整的情况,但可以通过更改某些设计来避免这种情况。