我尝试理解函数是如何工作的。我可以在 procedure
中进行等效操作,但无法使用 select
创建简单的函数。
元素
是UNIQUE
并且
事物
是主要
CREATE DEFINER=`root`@`localhost`
FUNCTION `get_element_by_thing`(`thing` VARCHAR(255))
RETURNS VARCHAR(255)
CHARSET utf8
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
DECLARE @return_element VARCHAR(255);
SET @return_element = (
SELECT
`element`
FROM
`table1`
WHERE
`thing` = thing
);
RETURN @return_element;
我使用phpmyadmin
界面。
最佳答案
1) 不要声明用户定义的变量。
MySQL 存储程序中的局部变量名称不以@ 符号开头。举个例子:
DECLARE stored_program_local_variable VARCHAR(255);
SET stored_program_local_variable = 'somevalue';
用户定义变量的名称以 @ 符号开头。 (at 符号是将用户定义的变量与其他标识符区分开来的。)在存储的程序中声明用户定义的变量是无效的。要创建用户定义变量,只需为其赋值即可。例如:
SET @user_defined_variable = 'somevalue';
2) 如果我们不需要保留超出存储程序范围的变量,我们通常使用局部变量,它们仅在存储程序执行期间存在。 (这与 session 级别的用户定义变量的行为不同。)
3) 使用SELECT ... INTO
语法将标量值检索到用户定义或局部变量中。 https://dev.mysql.com/doc/refman/5.7/en/select-into.html
尝试:
DELIMITER $$
CREATE DEFINER=`root`@`localhost`
FUNCTION `get_element_by_thing`(`thing` VARCHAR(255))
RETURNS VARCHAR(255)
...
BEGIN
DECLARE return_element VARCHAR(255) ;
SELECT t1.element
INTO return_element
FROM table1 t1
WHERE t1.thing = thing
LIMIT 1 ;
RETURN return_element ;
END $$
DELIMITER ;
注意:对于不明确的标识符(即 SQL 语句中的例程参数和列同名),例程参数优先于列名。使用表名或表别名来限定列引用,这样就不会产生歧义。I更喜欢分配与列名称不匹配的例程参数(和局部变量)名称。
如果由于某种原因需要在 SQL 语句中为用户定义的变量赋值,可以使用 :=
赋值运算符。这在存储程序的上下文之外也有效。
SELECT @user_defined_variable := t.somecolumn
FROM mytable t
WHERE somecondition
ORDER BY someexpression
LIMIT 1
关于mysql - 带有 SELECT 的简单 sql 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46181758/